CINXE.COM
Google Developers Blog
<!DOCTYPE html> <html class="v2 list-page" dir="ltr" itemscope="" itemtype="http://schema.org/Blog" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:b="http://www.google.com/2005/gml/b" xmlns:data="http://www.google.com/2005/gml/data" xmlns:expr="http://www.google.com/2005/gml/expr"> <head><script type="text/javascript" src="https://web-static.archive.org/_static/js/bundle-playback.js?v=7YQSqjSh" charset="utf-8"></script> <script type="text/javascript" src="https://web-static.archive.org/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="https://web-static.archive.org/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://developers.googleblog.com/","20210720135936","https://web.archive.org/","web","https://web-static.archive.org/_static/", "1626789576"); </script> <link rel="stylesheet" type="text/css" href="https://web-static.archive.org/_static/css/banner-styles.css?v=p7PEIJWi" /> <link rel="stylesheet" type="text/css" href="https://web-static.archive.org/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <link href="https://web.archive.org/web/20210720135936cs_/https://www.blogger.com/static/v1/widgets/3822632116-css_bundle_v2.css" rel="stylesheet" type="text/css"/> <title> Google Developers Blog </title> <meta content="width=device-width, height=device-height, minimum-scale=1.0, initial-scale=1.0, user-scalable=0" name="viewport"/> <meta content="IE=Edge" http-equiv="X-UA-Compatible"/> <meta content="Google Developers Blog" property="og:title"/> <meta content="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/devrel-devsite/prod/vc0d10ef7c6e8aac6c71e2a2051f66f30f3c99a4b52237746839ce4f1fae2b7b4/developers/images/lockup.svg" property="og:image"/> <meta content="News and insights on Google platforms, tools, and events." property="og:description"/> <meta content="en_US" property="og:locale"/> <meta content="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/" property="og:url"/> <meta content="Google Developers Blog" property="og:site_name"/> <!-- Twitter Card properties --> <meta content="summary_large_image" name="twitter:card"/> <meta content="@GoogleDevs" name="twitter:site"/> <meta content="@GoogleDevs" name="twitter:creator"/> <meta content="https://developers.googleblog.com/" name="twitter:domain"/> <meta content="https://web.archive.org/web/20210720135936im_/https://developers.googleblog.com/" name="twitter:url"/> <meta content="Google Developers Blog" name="twitter:title"/> <meta content="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/devrel-devsite/prod/vc0d10ef7c6e8aac6c71e2a2051f66f30f3c99a4b52237746839ce4f1fae2b7b4/developers/images/lockup.svg" name="twitter:image"/> <meta content="News and insights on Google platforms, tools, and events." name="twitter:description"/> <link href="https://web.archive.org/web/20210720135936cs_/https://fonts.googleapis.com/css?family=Roboto:400italic,400,500,500italic,700,700italic" rel="stylesheet" type="text/css"/> <link href="https://web.archive.org/web/20210720135936cs_/https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"/> <script src="https://web.archive.org/web/20210720135936js_/https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" type="text/javascript"></script> <!-- End --> <style id="page-skin-1" type="text/css"><!-- /* <Group description="Header Color" selector="header"> <Variable name="header.background.color" description="Header Background" type="color" default="#ffffff"/> </Group> */ .header-outer { border-bottom: 1px solid #e0e0e0; background: #eff0f2; } html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 { font-family: Roboto, sans-serif; } .plusfollowers h2.title, .post h2.title, .widget h2.title { font-family: Roboto, sans-serif; } .widget-item-control { height: 100%; } .widget.Header, #header { position: relative; height: 100%; width: 100%; } } .widget.Header .header-logo1 { float: left; margin-right: 15px; padding-right: 15px; border-right: 1px solid #ddd; } .header-title h2 { color: rgba(0,0,0,.54); display: inline-block; font-size: 40px; font-family: Roboto, sans-serif; font-weight: normal; line-height: 55px; vertical-align: top; } .header-inner { background-repeat: no-repeat; background-position: right 0px; } .post-author, .byline-author { font-size: 14px; font-weight: normal; color: #757575; color: rgba(0,0,0,.54); } .post-content .img-border { border: 1px solid rgb(235, 235, 235); padding: 4px; } .header-title a { text-decoration: none !important; } pre { border: 1px solid #bbbbbb; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } pre, code { font-size: 9pt; background-color: #fafafa; line-height: 125%; font-family: monospace; } pre, code { color: #060; font: 13px/1.54 "courier new",courier,monospace; } .header-left .header-logo1 { width: 128px !important; } .header-desc { line-height: 20px; margin-top: 8px; color: #676c72; } .fb-custom img, .twitter-custom img, .gplus-share img { cursor: pointer; opacity: 0.54; } .fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover { opacity: 0.87; } .fb-like { width: 80px; } .post .share { float: right; } #twitter-share{ border: #CCC solid 1px; border-radius: 3px; background-image: -webkit-linear-gradient(top,#ffffff,#dedede); } .twitter-follow { background: url(//web.archive.org/web/20210720135936im_/https://3.bp.blogspot.com/-M7uPAxKEeh4/WKrvV1ujKCI/AAAAAAAATZE/cdHhTldtvk4q4ad1Me1XDIgQD9Aul09CACK4B/s1600/twitter-bird.png) no-repeat left center; padding-left: 18px; font: normal normal normal 11px/18px 'Helvetica Neue',Arial,sans-serif; font-weight: bold; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; margin-bottom: 10px; } .twitter-fb { padding-top: 2px; } .fb-follow-button { background: -webkit-linear-gradient(#4c69ba, #3b55a0); background: -moz-linear-gradient(#4c69ba, #3b55a0); background: linear-gradient(#4c69ba, #3b55a0); border-radius: 2px; height: 18px; padding: 4px 0 0 3px; width: 57px; border: #4c69ba solid 1px; } .fb-follow-button a { text-decoration: none !important; text-shadow: 0 -1px 0 #354c8c; text-align: center; white-space: nowrap; font-size: 11px; color: white; vertical-align: top; } .fb-follow-button a:visited { color: white; } .fb-follow { padding: 0px 5px 3px 0px; width: 14px; vertical-align: bottom; } .gplus-wrapper { margin-top: 3px; display: inline-block; vertical-align: top; } .twitter-custom, .gplus-share { margin-right: 12px; } .fb-follow-button{ margin: 10px auto; } /** CUSTOM CODE **/ div.border { border-style: solid; border-width: 1px; padding: 10px; } div.centeritem { text-align: center; width: 100%; font-size: 80%; font-style: italic; }h3 { 115%; } #imgFull { display: block; margin: 10px auto; width: 90%; border: 0; padding: 0; } #imgHalf { display: block; margin: 10px auto; width: 50%; border: 0; padding: 0; } #flexParent { display: flex; width: 100%; justify-content: space-around; align-items: center; } #flexImg { width: 90%; margin: 0; padding: 0; border: 0; } #flexImg img { margin: 0 auto; display: block; padding: 0; width: 100%; } #imgCaption { text-align: center; font-style: italic; font-size: 85%; margin: -5px 0 10px 0; padding: 0; border: 0; } #floatRight { float: right; width: 45%; margin: 5px 0 5px 5px; padding: 0; border:0; } #floatLeft { float: left; width: 45%; margin: 5px 5px 5px 0; padding: 0; border:0; } --></style> <style id="template-skin-1" type="text/css"><!-- .header-outer { clear: both; background-color: white; } .header-inner { margin: auto; padding: 0px; } .header-title h2 { color: #fff; } .footer-outer { background: #f5f5f5; clear: both; margin: 0; } .footer-inner { margin: auto; padding: 0px; } .footer-inner-2 { /* Account for right hand column elasticity. */ max-width: calc(100% - 248px); } .google-footer-outer { clear: both; } .cols-wrapper, .google-footer-outer, .footer-inner, .header-inner { max-width: 978px; margin-left: auto; margin-right: auto; } .cols-wrapper { margin: auto; clear: both; margin-top: 60px; margin-bottom: 60px; overflow: hidden; } .col-main-wrapper { float: left; width: 100%; } .col-main { margin-right: 278px; max-width: 660px; } .col-right { float: right; width: 248px; margin-left: -278px; } /* Tweaks for layout mode. */ body#layout .google-footer-outer { display: none; } body#layout .header-outer, body#layout .footer-outer { background: none; } body#layout .header-inner { height: initial; } body#layout .cols-wrapper { margin-top: initial; margin-bottom: initial; } --></style> <!-- start all head --> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> <meta content="blogger" name="generator"/> <link href="https://web.archive.org/web/20210720135936im_/https://developers.googleblog.com/favicon.ico" rel="icon" type="image/x-icon"/> <link href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/" rel="canonical"/> <link rel="alternate" type="application/atom+xml" title="Google Developers Blog - Atom" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/feeds/posts/default"/> <link rel="alternate" type="application/rss+xml" title="Google Developers Blog - RSS" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/feeds/posts/default?alt=rss"/> <link rel="service.post" type="application/atom+xml" title="Google Developers Blog - Atom" href="https://www.blogger.com/feeds/596098824972435195/posts/default"/> <!--[if IE]><script type="text/javascript" src="https://www.blogger.com/static/v1/jsbin/3775400722-ieretrofit.js"></script> <![endif]--> <meta content="News and insights on Google platforms, tools, and events." name="description"/> <meta content="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/" property="og:url"/> <meta content="Google Developers Blog" property="og:title"/> <meta content="News and insights on Google platforms, tools, and events." property="og:description"/> <!--[if IE]> <script> (function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < html5.length; i++) { document.createElement(html5[i]); } try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} })(); </script> <![endif]--> <!-- end all head --> <base target="_self"/> <style> html { font-family: Roboto, sans-serif; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } body { padding: 0; /* This ensures that the scroll bar is always present, which is needed */ /* because content render happens after page load; otherwise the header */ /* would "bounce" in-between states. */ min-height: 150%; } h2 { font-size: 130%; } h1, h2, h3, h4, h5 { line-height: 2em; } html, h4, h5, h6 { font-size: 14px; } a, a:visited { color: #4184F3; text-decoration: none; } a:focus, a:hover, a:active { text-decoration: none; } .Header { margin-top: 15px; } .Header h1 { font-size: 32px; font-weight: 300; line-height: 32px; height: 42px; } .header-inner .Header .titlewrapper { padding: 0; margin-top: 30px; } .header-inner .Header .descriptionwrapper { padding: 0; margin: 0; } .cols-wrapper { margin-top: 56px; } .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 60px; } .header-inner { height: 256px; position: relative; } html, .header-inner a { color: #212121; color: rgba(0,0,0,.87); } .header-inner .google-logo { display: inline-block; background-size: contain; z-index: 1; height: 63px; overflow: hidden; margin-top: 4px; } .header-left { position: absolute; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 12px; width: 100%; } .google-logo { margin-left: -4px; } #google-footer { position: relative; font-size: 13px; list-style: none; text-align: right; } #google-footer a { color: #444; } #google-footer ul { margin: 0; padding: 0; height: 144px; line-height: 144px; } #google-footer ul li { display: inline; } #google-footer ul li:before { color: #999; content: "\00b7"; font-weight: bold; margin: 5px; } #google-footer ul li:first-child:before { content: ''; } #google-footer .google-logo-dark { left: 0; margin-top: -16px; position: absolute; top: 50%; } /** Sitemap links. **/ .footer-inner-2 { font-size: 14px; padding-top: 42px; padding-bottom: 74px; } .footer-inner-2 .HTML h2 { color: #212121; color: rgba(0,0,0,.87); font-size: 14px; font-weight: 500; padding-left: 0; margin: 10px 0; } .footer-inner-2 .HTML ul { font-weight: normal; list-style: none; padding-left: 0; } .footer-inner-2 .HTML li { line-height: 24px; padding: 0; } .footer-inner-2 li a { color: rgba(65,132,243,.87); } /** Archive widget. **/ .BlogArchive { font-size: 13px; font-weight: normal; } .BlogArchive .widget-content { display: none; } .BlogArchive h2, .Label h2 { color: #4184F3; text-decoration: none; } .BlogArchive .hierarchy li { display: inline-block; } /* Specificity needed here to override widget CSS defaults. */ .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li { margin: 0; padding-left: 0; text-indent: 0; } .BlogArchive .intervalToggle { cursor: pointer; } .BlogArchive .expanded .intervalToggle .new-toggle { -ms-transform: rotate(180deg); transform: rotate(180deg); } .BlogArchive .new-toggle { float: right; padding-top: 3px; opacity: 0.87; } #ArchiveList { text-transform: uppercase; } #ArchiveList .expanded > ul:last-child { margin-bottom: 16px; } #ArchiveList .archivedate { width: 100%; } /* Months */ .BlogArchive .items { max-width: 150px; margin-left: -4px; } .BlogArchive .expanded .items { margin-bottom: 10px; overflow: hidden; } .BlogArchive .items > ul { float: left; height: 32px; } .BlogArchive .items a { padding: 0 4px; } .Label { font-size: 13px; font-weight: normal; } .sidebar-icon { display: inline-block; width: 24px; height: 24px; vertical-align: middle; margin-right: 12px; margin-top: -1px } .Label a { margin-right: 4px; } .Label .widget-content { display: none; } .FollowByEmail { font-size: 13px; font-weight: normal; } .FollowByEmail h2 { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } .FollowByEmail .widget-content { display: none; } .searchBox input { border: 1px solid #eee; color: #212121; color: rgba(0,0,0,.87); font-size: 14px; padding: 8px 8px 8px 40px; width: 164px; font-family: Roboto, sans-serif; background: url("https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat; } .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: rgba(0,0,0,.54); } .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #000; opacity: 0.54; } .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #000; opacity: 0.54; } .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */ color: #757575; } .widget-item-control { margin-top: 0px; } .section { margin: 0; padding: 0; } #sidebar-top { border: 1px solid #eee; } #sidebar-top > div { margin: 16px 0; } .widget ul { line-height: 1.6; } /*main post*/ .post { margin-bottom:30px; } #main .post .title { margin: 0; } #main .post .title a { color: #212121; color: rgba(0,0,0,.87); font-weight: normal; font-size: 24px; } #main .post .title a:hover { text-decoration:none; color:#4184F3; } .message, #main .post .post-header { margin: 0; padding: 0; } #main .post .post-header .caption, #main .post .post-header .labels-caption, #main .post .post-footer .caption, #main .post .post-footer .labels-caption { color: #444; font-weight: 500; } #main .tr-caption-container td { text-align: left; } #main .post .tr-caption { color: #757575; color: rgba(0,0,0,.54); display: block; max-width: 560px; padding-bottom: 20px; } #main .post .tr-caption-container { line-height: 24px; margin: -1px 0 0 0 !important; padding: 4px 0; text-align: left; } #main .post .post-header .published{ font-size:11px; font-weight:bold; } .post-header .publishdate { font-size: 17px; font-weight:normal; color: #757575; color: rgba(0,0,0,.54); } #main .post .post-footer{ font-size:16px; padding-bottom: 21px; } .label-footer { margin-bottom: 12px; margin-top: 12px; } .comment-img { margin-right: 16px; opacity: 0.54; vertical-align: middle; } #main .post .post-header .published { margin-bottom: 20px; margin-top: -2px; } .post .post-content { color: #212121; color: rgba(0,0,0,.87); font-size: 17px; margin: 25px 0 36px 0; line-height: 32px; } .post-body .post-content ul, .post-body .post-content ol { margin: 16px 0; padding: 0 48px; } .post-summary { display: none; } /* Another old-style caption. */ .post-content div i, .post-content div + i { font-size: 14px; font-style: normal; color: #757575; color: rgba(0,0,0,.54); display: block; line-height: 24px; margin-bottom: 16px; text-align: left; } /* Another old-style caption (with link) */ .post-content a > i { color: #4184F3 !important; } /* Old-style captions for images. */ .post-content .separator + div:not(.separator) { margin-top: -16px; } /* Capture section headers. */ .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b { display: inline-block; margin-bottom: 8px; margin-top: 24px; } .post-content li { line-height: 32px; } /* Override all post images/videos to left align. */ .post-content .separator, .post-content > div { text-align: left; } .post-content .separator > a, .post-content .separator > span { margin-left: 0 !important; } .post-content img { max-width: 100%; height: auto; width: auto; } .post-content .tr-caption-container img { margin-bottom: 12px; } .post-content iframe, .post-content embed { max-width: 100%; } .post-content .carousel-container { margin-bottom: 48px; } #main .post-content b { font-weight: 500; } /* These are the main paragraph spacing tweaks. */ #main .post-content br { content: ' '; display: block; padding: 4px; } .post-content .space { display: block; height: 8px; } .post-content iframe + .space, .post-content iframe + br { padding: 0 !important; } #main .post .jump-link { margin-bottom:10px; } .post-content img, .post-content iframe { margin: 30px 0 20px 0; } .post-content > img:first-child, .post-content > iframe:first-child { margin-top: 0; } .col-right .section { padding: 0 16px; } #aside { background:#fff; border:1px solid #eee; border-top: 0; } #aside .widget { margin:0; } #aside .widget h2, #ArchiveList .toggle + a.post-count-link { color: #212121; color: rgba(0,0,0,.87); font-weight: 400 !important; margin: 0; } #ArchiveList .toggle { float: right; } #ArchiveList .toggle .material-icons { padding-top: 4px; } #sidebar .tab { cursor: pointer; } #sidebar .tab .arrow { display: inline-block; float: right; } #sidebar .tab .icon { display: inline-block; vertical-align: top; height: 24px; width: 24px; margin-right: 13px; margin-left: -1px; margin-top: 1px; color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget-content > :first-child { padding-top: 8px; } #sidebar .active .tab .arrow { -ms-transform: rotate(180deg); transform: rotate(180deg); } #sidebar .arrow { color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget h2 { font-size: 14px; line-height: 24px; display: inline-block; } #sidebar .widget .BlogArchive { padding-bottom: 8px; } #sidebar .widget { border-bottom: 1px solid #eee; box-shadow: 0px 1px 0 white; margin-bottom: 0; padding: 14px 0; min-height: 20px; } #sidebar .widget:last-child { border-bottom: none; box-shadow: none; margin-bottom: 0; } #sidebar ul { margin: 0; padding: 0; } #sidebar ul li { list-style:none; padding:0; } #sidebar ul li a { line-height: 32px; } #sidebar .archive { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC"); height: 24px; line-height: 24px; padding-left: 30px; } #sidebar .labels { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC"); height: 20px; line-height: 20px; padding-left: 30px; } #sidebar .rss a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); } #sidebar .subscription a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); } #sidebar-bottom { background: #f5f5f5; border-top:1px solid #eee; } #sidebar-bottom .widget { border-bottom: 1px solid #e0e0e0; padding: 15px 0; text-align: center; } #sidebar-bottom > div:last-child { border-bottom: 0; } #sidebar-bottom .text { line-height: 20px; } /* Home, forward, and backward pagination. */ .blog-pager { border-top : 1px #e0e0e0 solid; padding-top: 10px; margin-top: 15px; text-align: right !important; } #blog-pager { margin-botom: 0; margin-top: -14px; padding: 16px 0 0 0; } #blog-pager a { display: inline-block; } .blog-pager i.disabled { opacity: 0.2 !important; } .blog-pager i { color: black; margin-left: 16px; opacity: 0.54; } .blog-pager i:hover, .blog-pager i:active { opacity: 0.87; } #blog-pager-older-link, #blog-pager-newer-link { float: none; } .gplus-profile { background-color: #fafafa; border: 1px solid #eee; overflow: hidden; width: 212px; } .gplus-profile-inner { margin-left: -1px; margin-top: -1px; } /* Sidebar follow buttons. */ .followgooglewrapper { padding: 12px 0 0 0; } .loading { visibility: hidden; } .detail-page .post-footer .cmt_iframe_holder { padding-top: 40px !important; } /** Desktop **/ @media (max-width: 900px) { .col-right { display: none; } .col-main { margin-right: 0; min-width: initial; } .footer-outer { display: none; } .cols-wrapper { min-width: initial; } .google-footer-outer { background-color: #f5f5f5; } .header-title h2 { line-height: 55px; } } /** Tablet **/ @media (max-width: 712px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 40px; } } /* An extra breakpoint accommodating for long blog titles. */ @media (max-width: 600px) { .header-left { position: absolute; top: 35%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 30px; width: 100%; } .header-title { margin-top: 18px; } .header-inner .google-logo { height: 42px; margin-top: 3px; } .header-title h2 { font-size: 2em; line-height: 43px; } .header-desc { position: absolute; } .header-inner .google-logo img { height: 43px; } } /** Mobile/small desktop window; also landscape. **/ @media (max-width: 480px), (max-height: 480px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 16px; } .header-title h2 { font-size: 2em; line-height: 37px; } .cols-wrapper { margin-top: 0; } .post-header .publishdate, .post .post-content { font-size: 16px; } .post .post-content { line-height: 28px; margin-bottom: 30px; } .post { margin-top: 30px; } .byline-author { display: block; font-size: 12px; line-height: 24px; margin-top: 6px; } #main .post .title a { font-weight: 500; color: #4c4c4c; color: rgba(0,0,0,.70); } #main .post .post-header { padding-bottom: 12px; } #main .post .post-header .published { margin-bottom: -8px; margin-top: 3px; } .post .read-more { display: block; margin-top: 14px; } .post .tr-caption { font-size: 12px; } #main .post .title a { font-size: 20px; line-height: 30px; } .post-content iframe { /* iframe won't keep aspect ratio when scaled down. */ max-height: 240px; } .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe { margin-left: -16px; max-width: inherit; width: calc(100% + 32px); } .post-content table, .post-content td { width: 100%; } #blog-pager { margin: 0; padding: 16px 0; } /** List page tweaks. **/ .list-page .post-original { display: none; } .list-page .post-summary { display: block; } .list-page .comment-container { display: none; } .list-page #blog-pager { padding-top: 0; border: 0; margin-top: -8px; } .list-page .label-footer { display: none; } .list-page #main .post .post-footer { border-bottom: 1px solid #eee; margin: -16px 0 0 0; padding: 0 0 20px 0; } .list-page .post .share { display: none; } /** Detail page tweaks. **/ .detail-page .post-footer .cmt_iframe_holder { padding-top: 32px !important; } .detail-page .label-footer { margin-bottom: 0; } .detail-page #main .post .post-footer { padding-bottom: 0; } .detail-page #comments { display: none; } } @media (max-width: 600px) and (min-width: 410px) { .header-title h2 { font-size: 2.5em; line-height: 43px; } } [data-about-pullquote], [data-is-preview], [data-about-syndication] { display: none; } </style> <noscript> <style> .loading { visibility: visible }</style> </noscript> <script type="text/javascript"> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://web.archive.org/web/20210720135936/https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-19996418-48', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href="https://web.archive.org/web/20210720135936cs_/https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css" rel="stylesheet" type="text/css"/> <script language="javascript" src="https://web.archive.org/web/20210720135936js_/https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js" type="text/javascript"></script> <script language="javascript" src="https://web.archive.org/web/20210720135936js_/https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/lang-css.min.js" type="text/javascript"></script> <script type="text/javascript"> document.addEventListener('DOMContentLoaded',function() { prettyPrint(); }); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://web.archive.org/web/20210720135936/https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-WVTLDSL');</script> <!-- End Google Tag Manager --> <link href="https://web.archive.org/web/20210720135936cs_/https://www.blogger.com/dyn-css/authorization.css?targetBlogID=596098824972435195&zx=44bf6382-485c-435f-add9-d208d522757d" media="none" onload="if(media!='all')media='all'" rel="stylesheet"/><noscript><link href="https://web.archive.org/web/20210720135936cs_/https://www.blogger.com/dyn-css/authorization.css?targetBlogID=596098824972435195&zx=44bf6382-485c-435f-add9-d208d522757d" rel="stylesheet"/></noscript> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript><iframe height="0" src="https://web.archive.org/web/20210720135936if_/https://www.googletagmanager.com/ns.html?id=GTM-WVTLDSL" style="display:none;visibility:hidden" width="0"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <script type="text/javascript"> //<![CDATA[ var axel = Math.random() + ""; var a = axel * 10000000000000; document.write('<iframe src="https://web.archive.org/web/20210720135936/https://2542116.fls.doubleclick.net/activityi;src=2542116;type=gblog;cat=googl0;ord=ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>'); //]]> </script> <noscript> <img alt="" height="1" src="https://web.archive.org/web/20210720135936im_/https://ad.doubleclick.net/ddm/activity/src=2542116;type=gblog;cat=googl0;ord=1" width="1"/> </noscript> <!-- Header --> <div class="header-outer"> <div class="header-inner"> <div class="section" id="header"><div class="widget Header" data-version="1" id="Header1"> <div class="header-left"> <div class="header-title"> <a class="google-logo" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/"> <img height="60" src="https://web.archive.org/web/20210720135936im_/https://lh4.googleusercontent.com/proxy/w55Ib4qOQ6b-l6hOP-RnD-CXwb4T_M3Hc797PBOZAm4Qi9SQbNaO8TA3CXhbVOuH5A4kXa-w1WFOY66QVf8zcXJN-Ndf6WNbYe8tP-oAyAs=s0-d"> </a> </div> <div class="header-desc"> Blog of our latest news, updates, and stories for developers </div> </div> </div></div> </div> </div> <!-- all content wrapper start --> <div class="cols-wrapper loading"> <div class="col-main-wrapper"> <div class="col-main"> <div class="section" id="main"><div class="widget Blog" data-version="1" id="Blog1"> <div class="post" data-id="1153069056817700536" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/iamagde-homing-tam.html" itemprop="url" title="#IamaGDE: Homing Tam"> #IamaGDE: Homing Tam </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Thursday, July 15, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="display:none"> <p> <em>#IamaGDE series presents: Google Maps</em> </p> <p> <em>Welcome to #IamaGDE - a series of spotlights presenting Google Developer Experts (GDEs) from across the globe. Discover their stories, passions, and highlights of their community work.</em> </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image of GDE, Homing Tam" border="0" data-original-height="1600" data-original-width="1200" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="width:100%"/></a></div> <p> Homing Tam is a product manager at Lalamove, an on-demand logistics company. He started at the company as a product manager focusing on location-based systems, talking with developers and business users to enhance the company’s mapping solutions, before moving into product management. Now, Homing handles corporate solutions; takes care of people who want to integrate with his company’s systems; handles the API side of things to help make integration easier; and provides recommendations for developers and other technical teammates. </p> <p> <h2>Becoming a Maps developer</h2> </p> <p> Homing studied geomatics and computing at university, and his 2009 thesis was based on Google’s API backend. His dissertation focused on using the Google Maps API to perform mapping and overlay. His first full-time job was as a GIS analyst at Esri, the largest private software company in the world. A year and a half later, he became a solutions consultant for a different company, helping customers interested in integrating Google Maps with their software. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-tnjKkxdK2_I/YOjFg9Fp4AI/AAAAAAAAKdc/KJ0QNbOXHy0pVDTDUGL8QGpbvKL6QhMmwCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image of developer community meetup" border="0" data-original-height="900" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-tnjKkxdK2_I/YOjFg9Fp4AI/AAAAAAAAKdc/KJ0QNbOXHy0pVDTDUGL8QGpbvKL6QhMmwCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B2.png" style="width:100%"/></a></div> <p> <h2>Getting involved in the developer community</h2> </p> <p> After Homing got involved in the Google Technology User Group (now known as Google Developer Groups), his boss at the time told him about the Google Developer Experts program. For his interview, Homing presented a product using the Google Maps APIs. When he became a GDE, he gave presentations and talks in the greater China region as a surrogate for the Google Maps Platform team. Homing is currently one of the organizers for GDG Hong Kong, organizing and giving community talks. </p> <p> <h2>Favorite Maps features and current projects</h2> </p> <p> Homing says the <a href="mapstyle.withgoogle.com/">Maps Styling Wizard</a>, the precursor to the newer <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/maps/documentation/javascript/styling">Cloud-based Maps Styling features</a>, is one of his favorite features. </p> <p> <em>“Cartography, which I studied in college, matters a lot, especially to a simple black and white schematic map, or when matching the theme of a map to a site,” he says. “I like that feature a lot.” </em></p> <p> In 2020, Homing gave one talk on Android in the Android 11 Meetup and another talk on Maps at the first-ever virtual Hong Kong Devfest, and he’s ready to do more speaking. </p> <p> <em>“It had been a while since I gave a talk on maps, and the launch of <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/blog/products/maps-platform/introducing-new-maps-customization-features">Cloud-based Maps Styling </a>is so exciting that I feel like it’s time to do some presentations and let the community know more about it. Beyond knowing how to use the API, you need to know how you can make the most of the API.” </em></p> <p> Homing notes that this year, in particular, more small business owners need to know how to collect customer addresses, allow customers to place on-demand delivery orders, and update customers. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-LSkK3yxuYtQ/YOjHb5APguI/AAAAAAAAKdk/0gPy6B7CzyE5_pEVyvlImc0iw4l_VU-DQCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image from GDG developer community meetup in Hong Kong" border="0" data-original-height="1194" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-LSkK3yxuYtQ/YOjHb5APguI/AAAAAAAAKdk/0gPy6B7CzyE5_pEVyvlImc0iw4l_VU-DQCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B3.png" style="width:100%"/></a></div> <p> In 2021, in addition to giving more talks, Homing hopes to work with the GDG organizers in Hong Kong to plan a hackathon or otherwise teach community members more about the new Maps features. </p> <p> <em>“Can we make an MVP or a really initial stage cycling app to use as a base to explore the new features and use different Google components?’ </em></p> <p> As his career continues, Homing says he has two priorities: progressing as a product manager and leveraging technology, including maps, to improve lives. </p> <p> <em>“This year was a year for everyone to become digitally literate,” he says. “With the extra time we spend on technology, we should make good use of technology to make life better.” </em></p> <p> <em>For more information on Google Maps Platform, <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/maps-platform/">visit our website</a>.</em> </p> <p> <em>For more information on Google Developer Experts, <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/experts">visit our website</a>.</em> </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="display:none"> <p> <em>#IamaGDE series presents: Google Maps</em> </p> <p> <em>Welcome to #IamaGDE - a series of spotlights presenting Google Developer Experts (GDEs) from across the globe. Discover their stories, passions, and highlights of their community work.</em> </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image of GDE, Homing Tam" border="0" data-original-height="1600" data-original-width="1200" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/--zdh6Cpu9Q4/YOjFCXBmaFI/AAAAAAAAKdU/0UxJ4EMajHce_VKuii3d-8w0o4esNV7rgCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B1.png" style="width:100%"/></a></div> <p> Homing Tam is a product manager at Lalamove, an on-demand logistics company. He started at the company as a product manager focusing on location-based systems, talking with developers and business users to enhance the company’s mapping solutions, before moving into product management. Now, Homing handles corporate solutions; takes care of people who want to integrate with his company’s systems; handles the API side of things to help make integration easier; and provides recommendations for developers and other technical teammates. </p> <p> <h2>Becoming a Maps developer</h2> </p> <p> Homing studied geomatics and computing at university, and his 2009 thesis was based on Google’s API backend. His dissertation focused on using the Google Maps API to perform mapping and overlay. His first full-time job was as a GIS analyst at Esri, the largest private software company in the world. A year and a half later, he became a solutions consultant for a different company, helping customers interested in integrating Google Maps with their software. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-tnjKkxdK2_I/YOjFg9Fp4AI/AAAAAAAAKdc/KJ0QNbOXHy0pVDTDUGL8QGpbvKL6QhMmwCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image of developer community meetup" border="0" data-original-height="900" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-tnjKkxdK2_I/YOjFg9Fp4AI/AAAAAAAAKdc/KJ0QNbOXHy0pVDTDUGL8QGpbvKL6QhMmwCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B2.png" style="width:100%"/></a></div> <p> <h2>Getting involved in the developer community</h2> </p> <p> After Homing got involved in the Google Technology User Group (now known as Google Developer Groups), his boss at the time told him about the Google Developer Experts program. For his interview, Homing presented a product using the Google Maps APIs. When he became a GDE, he gave presentations and talks in the greater China region as a surrogate for the Google Maps Platform team. Homing is currently one of the organizers for GDG Hong Kong, organizing and giving community talks. </p> <p> <h2>Favorite Maps features and current projects</h2> </p> <p> Homing says the <a href="mapstyle.withgoogle.com/">Maps Styling Wizard</a>, the precursor to the newer <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/maps/documentation/javascript/styling">Cloud-based Maps Styling features</a>, is one of his favorite features. </p> <p> <em>“Cartography, which I studied in college, matters a lot, especially to a simple black and white schematic map, or when matching the theme of a map to a site,” he says. “I like that feature a lot.” </em></p> <p> In 2020, Homing gave one talk on Android in the Android 11 Meetup and another talk on Maps at the first-ever virtual Hong Kong Devfest, and he’s ready to do more speaking. </p> <p> <em>“It had been a while since I gave a talk on maps, and the launch of <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/blog/products/maps-platform/introducing-new-maps-customization-features">Cloud-based Maps Styling </a>is so exciting that I feel like it’s time to do some presentations and let the community know more about it. Beyond knowing how to use the API, you need to know how you can make the most of the API.” </em></p> <p> Homing notes that this year, in particular, more small business owners need to know how to collect customer addresses, allow customers to place on-demand delivery orders, and update customers. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-LSkK3yxuYtQ/YOjHb5APguI/AAAAAAAAKdk/0gPy6B7CzyE5_pEVyvlImc0iw4l_VU-DQCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="image from GDG developer community meetup in Hong Kong" border="0" data-original-height="1194" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-LSkK3yxuYtQ/YOjHb5APguI/AAAAAAAAKdk/0gPy6B7CzyE5_pEVyvlImc0iw4l_VU-DQCLcBGAsYHQ/s0/GD%2BBLOG%2B%2523IamaGDE%2BHoming%2BTam%2B3.png" style="width:100%"/></a></div> <p> In 2021, in addition to giving more talks, Homing hopes to work with the GDG organizers in Hong Kong to plan a hackathon or otherwise teach community members more about the new Maps features. </p> <p> <em>“Can we make an MVP or a really initial stage cycling app to use as a base to explore the new features and use different Google components?’ </em></p> <p> As his career continues, Homing says he has two priorities: progressing as a product manager and leveraging technology, including maps, to improve lives. </p> <p> <em>“This year was a year for everyone to become digitally literate,” he says. “With the extra time we spend on technology, we should make good use of technology to make life better.” </em></p> <p> <em>For more information on Google Maps Platform, <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/maps-platform/">visit our website</a>.</em> </p> <p> <em>For more information on Google Developer Experts, <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/experts">visit our website</a>.</em> </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:#IamaGDE: Homing Tam&url=https://developers.googleblog.com/2021/07/iamagde-homing-tam.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/07/iamagde-homing-tam.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/07/iamagde-homing-tam.html" data-url="https://developers.googleblog.com/2021/07/iamagde-homing-tam.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/07/iamagde-homing-tam.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud" rel="tag"> cloud </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDE" rel="tag"> GDE </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdg" rel="tag"> gdg </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/maps" rel="tag"> maps </a> </span> </div> </div> </div> <div class="post" data-id="2229801957680233888" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html" itemprop="url" title="How students built a web app with the potential to help frontline workers"> How students built a web app with the potential to help frontline workers </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Wednesday, July 14, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content=" https://1.bp.blogspot.com/-NoQBskNMHY8/YO9hxmOQqdI/AAAAAAAAKfY/C4oFclPzW_0T65eKNLMhJZyN17A9nkydwCLcBGAsYHQ/s0/GDSC.png "> <img src=" https://1.bp.blogspot.com/-NoQBskNMHY8/YO9hxmOQqdI/AAAAAAAAKfY/C4oFclPzW_0T65eKNLMhJZyN17A9nkydwCLcBGAsYHQ/s0/GDSC.png " style="display:none"> <p><em>Posted by Erica Hanson, Global Program Manager, Google Developer Student Clubs</em><p> <center> <a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-wbZEsMBmzKc/YO8ofwx8jdI/AAAAAAAAKew/CnYrk1Rc4z4gqDpQugf6WI7WmXc7O-jFwCLcBGAsYHQ/s0/Olly%2Band%2BDaniel%2B.png" imageanchor="1" ><img alt="Image of Olly and Daniel from GDSC at Wash U." border="0" data-original-height="714" data-original-width="1058" id="imgFull" src=" https://1.bp.blogspot.com/-wbZEsMBmzKc/YO8ofwx8jdI/AAAAAAAAKew/CnYrk1Rc4z4gqDpQugf6WI7WmXc7O-jFwCLcBGAsYHQ/s0/Olly%2Band%2BDaniel%2B.png " style="width:400px" /></a> <p id="imgCaption"> Image of Olly and Daniel from Google Developer Student Clubs at Wash U. </p> </center> <p> When Olly Cohen first arrived on campus at Washington University in St. Louis (Wash U), he knew the school was home to many talented and eager developers, just like him. Computer science is one of the most popular majors at Wash U, and graduates often find jobs in the tech industry. With that in mind, Olly was eager to build a community of peers who wanted to take theories learned in the classroom and put them to the test with tangible, real-life projects. So he decided to start his own <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">Google Developer Student Club</a>, a university-based community group for students interested in learning about Google developer technology. </p> <p> Olly <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/dsc/leads">applied to become Google Developer Student Club Lead</a> so he could start his own club with a faculty advisor, host workshops on developer products and platforms, and build projects that would give back to their community. </p> <p> He didn’t know it at the time, but starting the club would eventually lead him to the most impactful development project of his early career — building a web application with the potential to help front-line healthcare workers in St. Louis, Missouri, during the pandemic. </p> <h2>Growing a community with a mission</h2> <p> The <a href=" https://dsc.community.dev/washington-university-in-st-louis/ ">Google Developer Student Club</a> grew quickly. Within the first few months, Olly and the core team signed up 150 members, hosted events with 40 to 60 attendees on average and began working on five different projects. One of the club’s first successful projects, led by Tom Janoski, was building a tool for the visually impaired. <a href="https://web.archive.org/web/20210720135936/https://mindseyeradio.org/">The app</a> provides audio translations of visual media like newspapers and sports games. </p> <p> This success inspired them to focus their projects on social good missions, and in particular helping small businesses in St. Louis. With a clear goal established, the club began to take off, growing to over 250 members managed by 9 core team members. They were soon building 10 different community-focused projects, and attracting the attention of many local leaders, including university officials, professors and organizers. </p> <h2>Building a web app for front-line healthcare workers</h2> <p> As the St. Louis community began to respond to the coronavirus pandemic in early 2020, some of the leaders at Wash U wondered if there was a way to digitally track PPE needs from front-line health care staff at Wash U’s medical center. The Dean of McKelvey School of Engineering reached out to Olly Cohen and his friend Daniel Sosebee to see if the Google Developer Student Club could lend a hand. </p> <p> The request was sweeping: Build a web application that could potentially work for the clinical staff of Wash U’s academic hospital, Barnes-Jewish Hospital. </p> <p> So the students got right to work, consulting with Google employees, Wash U computer science professors, an industry software engineer, and an M.D./Ph.D. candidate at the university’s School of Medicine. </p> <p> With the team assembled, the student developers first created a platform where they could base their solution. Next, they built a simple prototype with a Google Form that linked to Google Sheets, so they could launch a pilot. Lastly, in conjunction with the Google Form, they developed a serverless web application with a form and data portal that could let all staff members easily request new PPE supplies. </p> <p> In other words, their solution was showing the potential to help medical personnel track PPE shortages in real time digitally, making it easier and faster to identify and gather the resources doctors need right away. A web app built by students poised to make a true difference, now that is what the Google Developer Student Club experience is all about. </p> <h2>Ready to make a difference? </h2> <p> Are you a student who also wants to use technology to make a difference in your community? <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">Click here to learn more</a> about joining or starting a Google Developer Student Club near you. </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-NoQBskNMHY8/YO9hxmOQqdI/AAAAAAAAKfY/C4oFclPzW_0T65eKNLMhJZyN17A9nkydwCLcBGAsYHQ/s0/GDSC.png "> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-NoQBskNMHY8/YO9hxmOQqdI/AAAAAAAAKfY/C4oFclPzW_0T65eKNLMhJZyN17A9nkydwCLcBGAsYHQ/s0/GDSC.png " style="display:none"> <p><em>Posted by Erica Hanson, Global Program Manager, Google Developer Student Clubs</em><p> <center> <a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-wbZEsMBmzKc/YO8ofwx8jdI/AAAAAAAAKew/CnYrk1Rc4z4gqDpQugf6WI7WmXc7O-jFwCLcBGAsYHQ/s0/Olly%2Band%2BDaniel%2B.png" imageanchor="1"><img alt="Image of Olly and Daniel from GDSC at Wash U." border="0" data-original-height="714" data-original-width="1058" id="imgFull" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-wbZEsMBmzKc/YO8ofwx8jdI/AAAAAAAAKew/CnYrk1Rc4z4gqDpQugf6WI7WmXc7O-jFwCLcBGAsYHQ/s0/Olly%2Band%2BDaniel%2B.png " style="width:400px"/></a> <p id="imgCaption"> Image of Olly and Daniel from Google Developer Student Clubs at Wash U. </p> </center> <p> When Olly Cohen first arrived on campus at Washington University in St. Louis (Wash U), he knew the school was home to many talented and eager developers, just like him. Computer science is one of the most popular majors at Wash U, and graduates often find jobs in the tech industry. With that in mind, Olly was eager to build a community of peers who wanted to take theories learned in the classroom and put them to the test with tangible, real-life projects. So he decided to start his own <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">Google Developer Student Club</a>, a university-based community group for students interested in learning about Google developer technology. </p> <p> Olly <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/dsc/leads">applied to become Google Developer Student Club Lead</a> so he could start his own club with a faculty advisor, host workshops on developer products and platforms, and build projects that would give back to their community. </p> <p> He didn’t know it at the time, but starting the club would eventually lead him to the most impactful development project of his early career — building a web application with the potential to help front-line healthcare workers in St. Louis, Missouri, during the pandemic. </p> <h2>Growing a community with a mission</h2> <p> The <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/washington-university-in-st-louis/ ">Google Developer Student Club</a> grew quickly. Within the first few months, Olly and the core team signed up 150 members, hosted events with 40 to 60 attendees on average and began working on five different projects. One of the club’s first successful projects, led by Tom Janoski, was building a tool for the visually impaired. <a href="https://web.archive.org/web/20210720135936/https://mindseyeradio.org/">The app</a> provides audio translations of visual media like newspapers and sports games. </p> <p> This success inspired them to focus their projects on social good missions, and in particular helping small businesses in St. Louis. With a clear goal established, the club began to take off, growing to over 250 members managed by 9 core team members. They were soon building 10 different community-focused projects, and attracting the attention of many local leaders, including university officials, professors and organizers. </p> <h2>Building a web app for front-line healthcare workers</h2> <p> As the St. Louis community began to respond to the coronavirus pandemic in early 2020, some of the leaders at Wash U wondered if there was a way to digitally track PPE needs from front-line health care staff at Wash U’s medical center. The Dean of McKelvey School of Engineering reached out to Olly Cohen and his friend Daniel Sosebee to see if the Google Developer Student Club could lend a hand. </p> <p> The request was sweeping: Build a web application that could potentially work for the clinical staff of Wash U’s academic hospital, Barnes-Jewish Hospital. </p> <p> So the students got right to work, consulting with Google employees, Wash U computer science professors, an industry software engineer, and an M.D./Ph.D. candidate at the university’s School of Medicine. </p> <p> With the team assembled, the student developers first created a platform where they could base their solution. Next, they built a simple prototype with a Google Form that linked to Google Sheets, so they could launch a pilot. Lastly, in conjunction with the Google Form, they developed a serverless web application with a form and data portal that could let all staff members easily request new PPE supplies. </p> <p> In other words, their solution was showing the potential to help medical personnel track PPE shortages in real time digitally, making it easier and faster to identify and gather the resources doctors need right away. A web app built by students poised to make a true difference, now that is what the Google Developer Student Club experience is all about. </p> <h2>Ready to make a difference? </h2> <p> Are you a student who also wants to use technology to make a difference in your community? <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">Click here to learn more</a> about joining or starting a Google Developer Student Club near you. </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:How students built a web app with the potential to help frontline workers&url=https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html" data-url="https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/07/how-students-built-web-app-with.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developers" rel="tag"> developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Student%20Clubs" rel="tag"> Google Developer Student Clubs </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developers" rel="tag"> google developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/student%20programs" rel="tag"> student programs </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20apps" rel="tag"> web apps </a> </span> </div> </div> </div> <div class="post" data-id="3675234516094842451" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html" itemprop="url" title="The Google Calendar API has changed how we manage API usage"> The Google Calendar API has changed how we manage API usage </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Friday, July 9, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="display:none"> <p><em>Posted by Charles Maxson, Developer Advocate </em><p> <p> The <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar">Google Calendar API</a> has changed how it manages API usage. Previously, queries were monitored and limited on a daily basis. As of May 2021, queries started to be monitored and limited on a per-minute basis. This introduces better behavior when your quota is exceeded, as requests are rate-limited until quota is available rather than failing all requests for the rest of the day. This also helps developers recognize issues around quota enforcements faster and shouldn't affect the performance of existing projects. </p> <p> To view your usage and quota limits, have a look in the <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/">Google API console</a>. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of Calendar API" border="0" data-original-height="391" data-original-width="400" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="width:80%"/></a></div> <p> To help you manage your quotas, we’ve put together a few helpful tips: </p> <ul> <li>Use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/push?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">push notifications</a> instead of polling. <li>If you cannot avoid polling, make sure you only poll when necessary (for example poll very seldomly at night). <li>Make sure to use randomized timing so that requests from your users spread out evenly instead of creating bursts. <li>Use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/sync?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">incremental synchronization</a> with sync tokens for all collections instead of repeatedly retrieving all the entries. <li>Increase <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/pagination?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">page size</a> to retrieve more data at once by using the maxResults parameter. <li>Update events when they change, avoid recreating all the events on every sync. <li>Use exponential backoff for error retries to make rate-limiting work properly. </li> </ul> <p> For further details into managing quotas please review the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar/quota">manage quotas documentation</a>. You can also find more details on error handling on the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar/v3/errors#403_daily_limit_exceeded">resolve errors documentation</a>. </p> <p> To stay on top of news and updates around Google Workspace APIs and developer platform please sign up to our <a href="https://web.archive.org/web/20210720135936/https://docs.google.com/forms/d/e/1FAIpQLSevxIt_IfyGl9QEERTO5H-ZM3TgBFTZoESAbzrTw_QzbzYG0w/viewform">developer newsletter</a>. </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="display:none"> <p><em>Posted by Charles Maxson, Developer Advocate </em><p> <p> The <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar">Google Calendar API</a> has changed how it manages API usage. Previously, queries were monitored and limited on a daily basis. As of May 2021, queries started to be monitored and limited on a per-minute basis. This introduces better behavior when your quota is exceeded, as requests are rate-limited until quota is available rather than failing all requests for the rest of the day. This also helps developers recognize issues around quota enforcements faster and shouldn't affect the performance of existing projects. </p> <p> To view your usage and quota limits, have a look in the <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/">Google API console</a>. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of Calendar API" border="0" data-original-height="391" data-original-width="400" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-Ukf82zuOlOw/YNt4lAQo6CI/AAAAAAAAKZQ/GBUqxF_layMzJhb0QkklFsP6NcnUKkC6wCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BThe%2BGoogle%2BCalendar%2BAPI%2Bis%2Bchanging%2Bhow%2Bwe%2Bmanage%2BAPI%2Busage%2B.png" style="width:80%"/></a></div> <p> To help you manage your quotas, we’ve put together a few helpful tips: </p> <ul> <li>Use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/push?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">push notifications</a> instead of polling. <li>If you cannot avoid polling, make sure you only poll when necessary (for example poll very seldomly at night). <li>Make sure to use randomized timing so that requests from your users spread out evenly instead of creating bursts. <li>Use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/sync?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">incremental synchronization</a> with sync tokens for all collections instead of repeatedly retrieving all the entries. <li>Increase <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/google-apps/calendar/v3/pagination?utm_campaign=cal-10x-1214&utm_source=gadbc&utm_medium=blog">page size</a> to retrieve more data at once by using the maxResults parameter. <li>Update events when they change, avoid recreating all the events on every sync. <li>Use exponential backoff for error retries to make rate-limiting work properly. </li> </ul> <p> For further details into managing quotas please review the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar/quota">manage quotas documentation</a>. You can also find more details on error handling on the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/calendar/v3/errors#403_daily_limit_exceeded">resolve errors documentation</a>. </p> <p> To stay on top of news and updates around Google Workspace APIs and developer platform please sign up to our <a href="https://web.archive.org/web/20210720135936/https://docs.google.com/forms/d/e/1FAIpQLSevxIt_IfyGl9QEERTO5H-ZM3TgBFTZoESAbzrTw_QzbzYG0w/viewform">developer newsletter</a>. </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:The Google Calendar API has changed how we manage API usage&url=https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html" data-url="https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/06/the-google-calendar-api-has-changed-how-we-manage-API-usage.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> </div> </div> </div> <div class="post" data-id="5748410508494836191" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html" itemprop="url" title="Migrating from App Engine webapp2 to Flask"> Migrating from App Engine webapp2 to Flask </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Thursday, July 8, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" style="display:none"> <em>Posted by Wesley Chun (<a href="https://web.archive.org/web/20210720135936/http://twitter.com/wescpy">@wescpy</a>), Developer Advocate, Google Cloud</em> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="graphic showing movement with arrows,. settings, lines, and more" border="0" data-original-height="512" data-original-width="1024" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" width="style:100%"/></a></div> <h2>Migrating web framework</h2> <p> The Google Cloud team recently introduced a series of <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1377290177152872449?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_modernizegae_codelabsannounce_201031&utm_content=-">codelabs</a> (free, self-paced, hands-on tutorials) and <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1407755281786867714?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_smsintro_201023&utm_content=-">corresponding videos</a> designed to help users on one of our serverless compute platforms modernize their apps, with an initial focus on our earliest users running their apps on <a href="https://web.archive.org/web/20210720135936/http://cloud.google.com/appengine">Google App Engine</a>. We kick off this content by showing users how to migrate from App Engine's <code><a href="webapp2.readthedocs.io">webapp2</a></code> web framework to <a href="flask.palletsprojects.com">Flask</a>, a popular framework in the Python community. <p> While users have always been able to use other frameworks with App Engine, <code>webapp2</code> comes bundled <em>with</em> App Engine, making it the default choice for many developers. One new requirement in App Engine's next generation platform (which <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/blog/products/gcp/introducing-app-engine-second-generation-runtimes-and-python-3-7">launched in 2018</a>) is that web frameworks must do their own routing, which unfortunately, means that <code>webapp2</code> is no longer supported, so here we are. The good news is that as a result, modern App Engine is more flexible, lets users to develop in a more idiomatic fashion, and makes their apps more portable. </p> <p> For example, while <code>webapp2</code> apps can run on App Engine, Flask apps can run on App Engine, your servers, your data centers, or even on other clouds! Furthermore, Flask has more users, more published resources, and is better supported. If Flask isn't right for you, you can select from other <a href="https://web.archive.org/web/20210720135936/https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#WSGI-compatible_applications_and_frameworks">WSGI-compliant frameworks</a> such as <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/python/django/appengine">Django</a>, <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/appengine/docs/standard/python3/specifying-dependencies?hl=id&refresh=1)%2C#installing_a_web_framework">Pyramid, and others</a>. </p> <h2>Video and codelab content</h2> <p> In this "Module 1" episode of <a href="https://web.archive.org/web/20210720135936/https://bit.ly/3xk2Swi">Serverless Migration Station</a> (part of the <a href="https://web.archive.org/web/20210720135936/https://goo.gle/ServerlessExpeditions">Serverless Expeditions series</a>) Google engineer Martin Omander and I explore this migration and walk developers through it step-by-step. </p> <iframe width="560" height="315" src="https://web.archive.org/web/20210720135936/https://www.youtube.com/embed/loZt1AabFF0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p> In the <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1407755281786867714?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_smsintro_201023&utm_content=-">previous video</a>, we introduced developers to the baseline Python 2 App Engine NDB <code>webapp2</code> sample app that we're taking through each of the migrations. In the video above, users see that the majority of the changes are in the main application handler, <code>MainHandler</code>: </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-xbmK0cb4h94/YN-EpspjeSI/AAAAAAAAKa0/D2q1xsO7evMIbV6hE7N1Z3bqNHKx-CmeQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="The diffs between the webapp2 and Flask versions of the sample app" border="0" data-original-height="717" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-xbmK0cb4h94/YN-EpspjeSI/AAAAAAAAKa0/D2q1xsO7evMIbV6hE7N1Z3bqNHKx-CmeQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B1.png" style="width:100%"/></a></div> <p> <center><strong><em>The "diffs" between the webapp2 and Flask versions of the sample app</em></strong></center> </p> <p> Upon (re)deploying the app, users should see no visible changes to the output from the original version: </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-7WvwRPaH-3Y/YN-GKqcJNvI/AAAAAAAAKa8/he_4j4A1urYp0brBXGGAwE4Cm2GlSpPHwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="VisitMe application sample output" border="0" data-original-height="895" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-7WvwRPaH-3Y/YN-GKqcJNvI/AAAAAAAAKa8/he_4j4A1urYp0brBXGGAwE4Cm2GlSpPHwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B2.png" style="width:100%"/></a></div> <p> <center><strong><em>VisitMe application sample output</em></strong></center> </p> <h2>Next steps</h2> <p> Today's video picks up from where we left off: the Python 2 baseline app in its <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine/tree/master/mod0-baseline">Module 0 repo folder</a>. We call this the "START". By the time the migration has completed, the resulting source code, called "FINISH", can be found in the <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine/tree/master/mod1-flask">Module 1 repo folder</a>. If you mess up partway through, you can rewind back to the START, or compare your solution with ours, FINISH. We also hope to one day provide a Python 3 version as well as cover other legacy runtimes like Java 8, PHP 5, and Go 1.11 and earlier, so stay tuned! </p> <p> All of the migration learning modules, corresponding videos (when published), codelab tutorials, START and FINISH code, etc., can all be found in the <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine">migration repo</a>. The next video (Module 2) will cover migrating from App Engine's <code>ndb</code> <a href="https://web.archive.org/web/20210720135936/http://cloud.google.com/appengine/docs/standard/python/ndb">library for Datastore</a> to <a href="https://web.archive.org/web/20210720135936/http://googleapis.dev/python/python-ndb/latest">Cloud NDB</a>. We hope you find all these resources helpful in your quest to modernize your serverless apps! </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" style="display:none"> <em>Posted by Wesley Chun (<a href="https://web.archive.org/web/20210720135936/http://twitter.com/wescpy">@wescpy</a>), Developer Advocate, Google Cloud</em> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="graphic showing movement with arrows,. settings, lines, and more" border="0" data-original-height="512" data-original-width="1024" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-c8Q-0pZoU60/YNEW2hDqaeI/AAAAAAAAKWw/e6O_rtp9qycJdXwzdmjvk-T-Bh37-nZlwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BIntroducing%2B%2522Serverless%2BMigration%2BStation%2522%2Bvideo%2Bseries.png" width="style:100%"/></a></div> <h2>Migrating web framework</h2> <p> The Google Cloud team recently introduced a series of <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1377290177152872449?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_modernizegae_codelabsannounce_201031&utm_content=-">codelabs</a> (free, self-paced, hands-on tutorials) and <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1407755281786867714?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_smsintro_201023&utm_content=-">corresponding videos</a> designed to help users on one of our serverless compute platforms modernize their apps, with an initial focus on our earliest users running their apps on <a href="https://web.archive.org/web/20210720135936/http://cloud.google.com/appengine">Google App Engine</a>. We kick off this content by showing users how to migrate from App Engine's <code><a href="webapp2.readthedocs.io">webapp2</a></code> web framework to <a href="flask.palletsprojects.com">Flask</a>, a popular framework in the Python community. <p> While users have always been able to use other frameworks with App Engine, <code>webapp2</code> comes bundled <em>with</em> App Engine, making it the default choice for many developers. One new requirement in App Engine's next generation platform (which <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/blog/products/gcp/introducing-app-engine-second-generation-runtimes-and-python-3-7">launched in 2018</a>) is that web frameworks must do their own routing, which unfortunately, means that <code>webapp2</code> is no longer supported, so here we are. The good news is that as a result, modern App Engine is more flexible, lets users to develop in a more idiomatic fashion, and makes their apps more portable. </p> <p> For example, while <code>webapp2</code> apps can run on App Engine, Flask apps can run on App Engine, your servers, your data centers, or even on other clouds! Furthermore, Flask has more users, more published resources, and is better supported. If Flask isn't right for you, you can select from other <a href="https://web.archive.org/web/20210720135936/https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#WSGI-compatible_applications_and_frameworks">WSGI-compliant frameworks</a> such as <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/python/django/appengine">Django</a>, <a href="https://web.archive.org/web/20210720135936/https://cloud.google.com/appengine/docs/standard/python3/specifying-dependencies?hl=id&refresh=1)%2C#installing_a_web_framework">Pyramid, and others</a>. </p> <h2>Video and codelab content</h2> <p> In this "Module 1" episode of <a href="https://web.archive.org/web/20210720135936/https://bit.ly/3xk2Swi">Serverless Migration Station</a> (part of the <a href="https://web.archive.org/web/20210720135936/https://goo.gle/ServerlessExpeditions">Serverless Expeditions series</a>) Google engineer Martin Omander and I explore this migration and walk developers through it step-by-step. </p> <iframe width="560" height="315" src="https://web.archive.org/web/20210720135936if_/https://www.youtube.com/embed/loZt1AabFF0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p> In the <a href="https://web.archive.org/web/20210720135936/http://twitter.com/googledevs/status/1407755281786867714?utm_source=twitter&utm_medium=unpaidsoc&utm_campaign=CDR_wes_aap-serverless_smsintro_201023&utm_content=-">previous video</a>, we introduced developers to the baseline Python 2 App Engine NDB <code>webapp2</code> sample app that we're taking through each of the migrations. In the video above, users see that the majority of the changes are in the main application handler, <code>MainHandler</code>: </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-xbmK0cb4h94/YN-EpspjeSI/AAAAAAAAKa0/D2q1xsO7evMIbV6hE7N1Z3bqNHKx-CmeQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="The diffs between the webapp2 and Flask versions of the sample app" border="0" data-original-height="717" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-xbmK0cb4h94/YN-EpspjeSI/AAAAAAAAKa0/D2q1xsO7evMIbV6hE7N1Z3bqNHKx-CmeQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B1.png" style="width:100%"/></a></div> <p> <center><strong><em>The "diffs" between the webapp2 and Flask versions of the sample app</em></strong></center> </p> <p> Upon (re)deploying the app, users should see no visible changes to the output from the original version: </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-7WvwRPaH-3Y/YN-GKqcJNvI/AAAAAAAAKa8/he_4j4A1urYp0brBXGGAwE4Cm2GlSpPHwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="VisitMe application sample output" border="0" data-original-height="895" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-7WvwRPaH-3Y/YN-GKqcJNvI/AAAAAAAAKa8/he_4j4A1urYp0brBXGGAwE4Cm2GlSpPHwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BMigrating%2Bfrom%2BApp%2BEngine%2Bwebapp2%2Bto%2BFlask%2B2.png" style="width:100%"/></a></div> <p> <center><strong><em>VisitMe application sample output</em></strong></center> </p> <h2>Next steps</h2> <p> Today's video picks up from where we left off: the Python 2 baseline app in its <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine/tree/master/mod0-baseline">Module 0 repo folder</a>. We call this the "START". By the time the migration has completed, the resulting source code, called "FINISH", can be found in the <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine/tree/master/mod1-flask">Module 1 repo folder</a>. If you mess up partway through, you can rewind back to the START, or compare your solution with ours, FINISH. We also hope to one day provide a Python 3 version as well as cover other legacy runtimes like Java 8, PHP 5, and Go 1.11 and earlier, so stay tuned! </p> <p> All of the migration learning modules, corresponding videos (when published), codelab tutorials, START and FINISH code, etc., can all be found in the <a href="https://web.archive.org/web/20210720135936/https://github.com/googlecodelabs/migrate-python2-appengine">migration repo</a>. The next video (Module 2) will cover migrating from App Engine's <code>ndb</code> <a href="https://web.archive.org/web/20210720135936/http://cloud.google.com/appengine/docs/standard/python/ndb">library for Datastore</a> to <a href="https://web.archive.org/web/20210720135936/http://googleapis.dev/python/python-ndb/latest">Cloud NDB</a>. We hope you find all these resources helpful in your quest to modernize your serverless apps! </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Migrating from App Engine webapp2 to Flask&url=https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html" data-url="https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/07/migrating-from-app-engine-webapp2-to-flask.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apis" rel="tag"> apis </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app" rel="tag"> app </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/App%20dev" rel="tag"> App dev </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/App%20Development" rel="tag"> App Development </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app%20engine" rel="tag"> app engine </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Application%20Development" rel="tag"> Application Development </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud" rel="tag"> cloud </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20platform" rel="tag"> cloud platform </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20services" rel="tag"> cloud services </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer" rel="tag"> developer </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developers" rel="tag"> developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20APIs" rel="tag"> Google APIs </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud" rel="tag"> Google Cloud </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud%20Platform" rel="tag"> Google Cloud Platform </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/python" rel="tag"> python </a> </span> </div> </div> </div> <div class="post" data-id="2870520990023552714" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html" itemprop="url" title="Assistant Recap Google I/O 2021"> Assistant Recap Google I/O 2021 </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Friday, July 2, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="display:none"> <p><em>Written by: <a href="https://web.archive.org/web/20210720135936/https://twitter.com/chatasweetie">Jessica Dene Earley-Cha</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/irreverentmike">Mike Bifulco</a> and <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ToniCorinne">Toni Klopfenstein</a>, Developer Relations Engineers for Google Assistant</em><p> <p> Now that we’ve packed up all of the virtual stages from <a href="https://web.archive.org/web/20210720135936/https://events.google.com/io/program/discover">Google I/O 2021</a>, let's take a look at some of the highlights and new product announcements for App Actions, Conversational Actions, and Smart Home Actions. We also held a number of amazing live events and meetups that happened during I/O - which we’ll summarize as well. </p> <iframe width="560" height="315" src="https://web.archive.org/web/20210720135936/https://www.youtube.com/embed/qTJ-f16iV_g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <h2>App Actions</h2> <p> <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/overview">App Actions</a> allows developers to extend their Android App to Google Assistant. For our Android Developers, we are happy to announce that App Actions is now part of the Android framework. With the introduction of the beta shortcuts.xml configuration resource and our latest Google Assistant Plug App Actions is moving closer to the Android platform. </p> <h3>Capabilities</h3> <p> <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/guide/topics/ui/shortcuts/adding-capabilities">Capabilities</a> is a new Android framework API that allows you to declare the types of actions users can take to launch your app and jump directly to performing a specific task. Assistant provides the first available concrete implementation of the capabilities API. You can utilize capabilities by <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/action-schema">creating shortcuts.xml</a> resources and defining your capabilities. Capabilities specify two things: how it's triggered and what to do when it's triggered. To add a capability, use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/intents">Built-In intents</a> (BIIs), which are pre-built intents that provide all the Natural Language Understanding to map the user's input to individual fields. When a BII is matched by the user’s speech, your capability will trigger an <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/reference/android/content/Intent">Android Intent</a> that delivers the understood BII fields to your app, so you can determine what to show in response. </p> <p> This framework integration is in the Beta release stage, and will eventually replace the original implementation of App Actions that uses actions.xml. If your app provides both the new shortcuts.xml and old actions.xml, the latter will be disregarded. </p> <h3>Voice shortcuts for Discovery</h3> <p> Google Assistant suggests relevant shortcuts to users and has made it easier for users to discover and add shortcuts by saying “Hey Google, shortcuts.” </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-61dVv-XqjgE/YN4kzLxpWdI/AAAAAAAAKaA/K0aHvFNCWb0fuZWeCaT0SIYUowGizN1OwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BRecap%2Bof%2BAssistant%2Bat%2BGoogle%2BI%253AO%2B2021_2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of Google Assistant voice shortcuts" border="0" data-original-height="1178" data-original-width="1062" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-61dVv-XqjgE/YN4kzLxpWdI/AAAAAAAAKaA/K0aHvFNCWb0fuZWeCaT0SIYUowGizN1OwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BRecap%2Bof%2BAssistant%2Bat%2BGoogle%2BI%253AO%2B2021_2.png" style="width:75%"/></a></div> <p> You can use the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/dynamic-shortcuts">Google Shortcuts Integration library</a>, currently in beta, to push an unlimited number of dynamic shortcuts to Google to make your shortcuts visible to users as voice shortcuts. Assistant can suggest relevant shortcuts to users to help make it more convenient for the user to interact with your Android app. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-uIZddEKPaww/YN4l4LLLHmI/AAAAAAAAKaI/64C-o7QeieMmB26m5buX_DEoApBeaXH-QCLcBGAsYHQ/s0/inAppPromo.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of In App Promo SDK" border="0" data-original-height="1010" data-original-width="698" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-uIZddEKPaww/YN4l4LLLHmI/AAAAAAAAKaI/64C-o7QeieMmB26m5buX_DEoApBeaXH-QCLcBGAsYHQ/s0/inAppPromo.gif" style="width:75%"/></a></div> <h3>In-App Promo SDK</h3> <p> Not only can Assistant suggest shortcuts, with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/in-app-promo-sdk">In-App Promo SDK</a> you can proactively suggest shortcuts in your app for actions that the user can repeat with a voice command to Assistant, in beta. The SDK allows you to check if the shortcut you want to suggest already exists for that user and prompt the user to create the suggested shortcut. </p> <h3>Google Assistant plugin for Android Studio </h3> <p> To support testing Capabilities, <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/test-tool">Google Assistant plugin</a> for Android Studio was launched. It contains an updated App Action Test Tool that creates a preview of your App Action, so you can test an integration before publishing it to the Play store. </p> <h3>New App Actions resources</h3> <p> Learn more with new or updated content: </p> <ul> <li>Updated and new <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/overview">Documentation</a>, including a new <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=DozT--NclbM">App Action Overview Video</a> <li>New <a href="https://web.archive.org/web/20210720135936/https://codelabs.developers.google.com/codelabs/appactions-beta">beta codelab</a> that walks you through adding two common BIIs using capabilities defined in shortcuts.xml <li>9 new videos on the <a href="https://web.archive.org/web/20210720135936/http://goo.gle/assistant-app-videos">App Actions Playlist</a>, which include <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=vp8X0BpheY0&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=7">How to voicify your Android app</a> and <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=zMs7DgniUqs&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=8">Android shortcuts for Assistant</a> sessions, <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=kqBboR-5YeE&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=4">App Actions AMA</a>, short 2 min demos of <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=lxviLXXvs3A&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=6">How to create your first App Action</a> and <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=lNFxidfuz0w&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=5">App Actions test tool</a> </li> </ul> <h2><strong>Conversational Actions</strong> </h2> <p> During the <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=O2gCx_iX2vQ">What's New in Google Assistant</a> keynote, Director of Product for the Google Assistant Developer Platform Rebecca Nathenson mentioned several coming updates and changes for Conversational Actions. </p> <h3>Updates to Interactive Canvas</h3> <p> Over the coming weeks, we’ll introduce new functionality to Interactive Canvas. Canvas developers will be able to manage intent fulfillment client-side, removing the need for intermediary webhooks in some cases. For use cases which require server-side fulfillment, like transactions and account linking, developers will be able to opt-in to server-side fulfillment as needed.<br><br>We’re also introducing a new function, <code>outputTts()</code>, which allows you to trigger Text to Speech client-side. This should help reduce latency for end users. </p> <p> Additionally, there will be updates to the APIs available to get and set storage for both the home and individual users, allowing for client-side storage of user information. You’ll be able to persist user information within your web app, which was previously only available for access by webhook. </p> <p> <br>These new features for Interactive Canvas will be made available soon as part of a developer preview for Conversational Actions Developers. For more details on these new features, check out the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/interactivecanvas/preview">preview page</a>. </p> <h3>Updates to Transaction UX for Smart Displays</h3> <p> Also coming soon to Conversational Actions - we’re updating the workflow for completing transactions, allowing users to complete transactions from their smart screens, by confirming the CVC code from their chosen payment method. Watch our <a href="https://web.archive.org/web/20210720135936/https://youtu.be/z6l-V-EOGNY">demo video showing new transaction features on smart devices</a> to get a feel for these changes. </p> <h3>Tips on Launching your Conversational Action</h3> <p> Make sure to catch our technical session <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=V2izYekSSwY">Driving a successful launch for Conversational Actions</a> to learn about some strategies for putting together a marketing team and go-to-market plan for releasing your Conversational Action. </p> <h3>AMA: Games on Google Assistant</h3> <p> If you’re interested in building Games for Google Assistant with Conversational Actions, you should <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=nOP-3EYaad8">check out the recording</a> of our AMA, where Googlers answered questions from I/O attendees about designing, building, and launching games. </p> <h2><br><strong>Smart Home Actions</strong> </h2> <p> The <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=fWMDkIziINQ">What's new in Smart Home</a> keynote covered several updates for Smart Home Actions. Following our continued emphasis on quality smart home integrations with the updated policy launch, we added new features to help you build engaging, reliable Actions for your users. </p> <h3>Test Suite and Analytics</h3> <p> The updated <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/tools/smart-home-test-suite">Test Suite for Smart Home</a> now supports automatic testing, without the use of TTS. Additionally, the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/monitoring-logging">Analytics</a> dashboards have been expanded with more detailed logs and in-depth error reporting to help you more quickly identify any potential issues with your Action. For a deeper dive into these enhancements, try out the <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=dXrKSNJA0cw">Debugging the Smart Home</a> workshop. There are also two new debugging <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/codelabs">codelabs</a> to help you get more familiar with using these tools to improve the quality of your Action. </p> <h3>Notifications</h3> <p> We expanded support for proactive <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/notifications">notifications</a> to include the device traits RunCycle and SensorState. Users can now be proactively notified for multiple different device events. We also announced the release of follow-up responses. These follow-up responses enable your smart devices to notify users asynchronously to device changes succeeding or failing. </p> <h3>WebRTC</h3> <p> We added support for <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/traits/eap/camerastream#webrtc">WebRTC</a> to the CameraStream trait. Smart camera users can now benefit from lower latency and half-duplex talk between devices. As mentioned in the keynote, we will also be making updates to the other currently supported protocols for smart cameras. </p> <h3>Bluetooth Seamless Setup</h3> <p> To improve the on-boarding experience, developers can now enable BLE (bluetooth low energy) for device onboarding with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/seamless-setup">Bluetooth Seamless Setup</a>. Google Home and Nest devices can act as local hubs to provision and register nearby devices for any Action configured with local fulfillment. </p> <h3>Matter</h3> <p> Project CHIP has officially rebranded as <a href="https://web.archive.org/web/20210720135936/https://buildwithmatter.com/">Matter</a>. Once the IP-based connectivity protocol officially launches, we will be supporting devices running the protocol. Watch the <a href="https://web.archive.org/web/20210720135936/https://events.google.com/io/session/a33eb15c-bdd4-41a4-a1af-9c3ba446e515">Getting started with Project CHIP</a><span style="text-decoration:underline;"> </span>tech session to learn more. </p> <h2>Ecosystem and Community</h2> <h3>The women building voice AI and their role in the voice revolution</h3> <p> Voice AI is fundamentally changing how we interact with technology and its future will be a product of the people that build it. Watch this <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=NV5SQzScn_8">session</a> to hear about the talented women shaping the Voice AI field, including an interview with Lilian Rincon, Sr. Director of Product Management at Google. Leslie also discusses strategies for achieving equal gender representation in Voice AI, an ambitious but essential goal. </p> <h3>AMA: How the Assistant Investment Program can help fund your startup</h3> <p> This "Ask Me Anything" session was hosted by the all-star team who runs the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/accelerators/voice">Google for Startups Accelerator: Voice AI</a>. The team fielded questions from startups and investors around the world who are interested in building businesses based on voice technology. Check out the recording of this event <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=QmLJr__vRtA">here</a>. The day after the AMA session, the 2021 cohort for the Voice AI accelerator had their demo day - you can catch the recording of their presentations <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=-rxsBnjELlM">here</a>. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-OjIl3pPbYJQ/YN4nojQwC_I/AAAAAAAAKaQ/JVY2YBD_IM8lNkd_bfyKntObNAOmfvGUACLcBGAsYHQ/s0/GD%2BBLOG%2BRecap%2Bof%2BAssistant%2B3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from the AMA titled: How the Assistant Investment Program can help fund your startup" border="0" data-original-height="634" data-original-width="1038" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-OjIl3pPbYJQ/YN4nojQwC_I/AAAAAAAAKaQ/JVY2YBD_IM8lNkd_bfyKntObNAOmfvGUACLcBGAsYHQ/s0/GD%2BBLOG%2BRecap%2Bof%2BAssistant%2B3.png" style="width:75%"/></a></div> <h3>Women in Voice Meetup</h3> <p> We connected with amazing women in Voice AI and discussed ways allies can help women in Voice to be more successful while building a more inclusive ecosystem. It was hosted by <a href="https://web.archive.org/web/20210720135936/https://twitter.com/Smutzla">Leslie Garcia-Amaya</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/chatasweetie">Jessica Dene Earley-Cha</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/LaKariAlarcon">Karina Alarcon</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/irreverentmike">Mike Bifulco</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/cpearl42">Cathy Pearl</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ToniCorinne">Toni Klopfenstein</a>, <a href="https://web.archive.org/web/20210720135936/https://www.linkedin.com/in/shikhakapoor/">Shikha Kapoor</a> & <a href="https://web.archive.org/web/20210720135936/https://www.linkedin.com/in/walquiriasaad/">Walquiria Saad</a> </p> <h3>Smart home developer Meetups </h3> <p> One of the perks of I/O being virtual this year was the ability to connect with students, hobbyists, and developers around the globe to discuss the current state of Smart Home, as well as some of the upcoming features. We hosted 3 meetups for the APAC, Americas, and EMEA regions and gathered some great feedback from the community. </p> <h3>Assistant Google Developers Experts Meetup</h3> <p> Every year we host an <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/community/gde">Assistant Google Developer Expert</a> meetup to connect and share knowledge. This year we were able to invite everyone who is interested in building for Google Assistant to network and connect with one another. At the end several attendees came together at the Assistant Sandbox for a virtual photo! </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of GoogleIO assitant meetup" border="0" data-original-height="527" data-original-width="696" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="width:80%"/></a></div> <p> <em>Thanks for reading! To share your thoughts or questions, join us on Reddit at <a href="https://web.archive.org/web/20210720135936/https://www.reddit.com/r/GoogleAssistantDev/">r/GoogleAssistantDev</a>. </em> </p> <p> <em>Follow <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ActionsOnGoogle">@ActionsOnGoogle</a> on Twitter for more of our team's updates, and tweet using #AoGDevs to share what you’re working on. Can’t wait to see what you build!</em> </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="display:none"> <p><em>Written by: <a href="https://web.archive.org/web/20210720135936/https://twitter.com/chatasweetie">Jessica Dene Earley-Cha</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/irreverentmike">Mike Bifulco</a> and <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ToniCorinne">Toni Klopfenstein</a>, Developer Relations Engineers for Google Assistant</em><p> <p> Now that we’ve packed up all of the virtual stages from <a href="https://web.archive.org/web/20210720135936/https://events.google.com/io/program/discover">Google I/O 2021</a>, let's take a look at some of the highlights and new product announcements for App Actions, Conversational Actions, and Smart Home Actions. We also held a number of amazing live events and meetups that happened during I/O - which we’ll summarize as well. </p> <iframe width="560" height="315" src="https://web.archive.org/web/20210720135936if_/https://www.youtube.com/embed/qTJ-f16iV_g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <h2>App Actions</h2> <p> <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/overview">App Actions</a> allows developers to extend their Android App to Google Assistant. For our Android Developers, we are happy to announce that App Actions is now part of the Android framework. With the introduction of the beta shortcuts.xml configuration resource and our latest Google Assistant Plug App Actions is moving closer to the Android platform. </p> <h3>Capabilities</h3> <p> <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/guide/topics/ui/shortcuts/adding-capabilities">Capabilities</a> is a new Android framework API that allows you to declare the types of actions users can take to launch your app and jump directly to performing a specific task. Assistant provides the first available concrete implementation of the capabilities API. You can utilize capabilities by <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/action-schema">creating shortcuts.xml</a> resources and defining your capabilities. Capabilities specify two things: how it's triggered and what to do when it's triggered. To add a capability, use <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/intents">Built-In intents</a> (BIIs), which are pre-built intents that provide all the Natural Language Understanding to map the user's input to individual fields. When a BII is matched by the user’s speech, your capability will trigger an <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/reference/android/content/Intent">Android Intent</a> that delivers the understood BII fields to your app, so you can determine what to show in response. </p> <p> This framework integration is in the Beta release stage, and will eventually replace the original implementation of App Actions that uses actions.xml. If your app provides both the new shortcuts.xml and old actions.xml, the latter will be disregarded. </p> <h3>Voice shortcuts for Discovery</h3> <p> Google Assistant suggests relevant shortcuts to users and has made it easier for users to discover and add shortcuts by saying “Hey Google, shortcuts.” </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-61dVv-XqjgE/YN4kzLxpWdI/AAAAAAAAKaA/K0aHvFNCWb0fuZWeCaT0SIYUowGizN1OwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BRecap%2Bof%2BAssistant%2Bat%2BGoogle%2BI%253AO%2B2021_2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of Google Assistant voice shortcuts" border="0" data-original-height="1178" data-original-width="1062" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-61dVv-XqjgE/YN4kzLxpWdI/AAAAAAAAKaA/K0aHvFNCWb0fuZWeCaT0SIYUowGizN1OwCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BRecap%2Bof%2BAssistant%2Bat%2BGoogle%2BI%253AO%2B2021_2.png" style="width:75%"/></a></div> <p> You can use the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/dynamic-shortcuts">Google Shortcuts Integration library</a>, currently in beta, to push an unlimited number of dynamic shortcuts to Google to make your shortcuts visible to users as voice shortcuts. Assistant can suggest relevant shortcuts to users to help make it more convenient for the user to interact with your Android app. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-uIZddEKPaww/YN4l4LLLHmI/AAAAAAAAKaI/64C-o7QeieMmB26m5buX_DEoApBeaXH-QCLcBGAsYHQ/s0/inAppPromo.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of In App Promo SDK" border="0" data-original-height="1010" data-original-width="698" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-uIZddEKPaww/YN4l4LLLHmI/AAAAAAAAKaI/64C-o7QeieMmB26m5buX_DEoApBeaXH-QCLcBGAsYHQ/s0/inAppPromo.gif" style="width:75%"/></a></div> <h3>In-App Promo SDK</h3> <p> Not only can Assistant suggest shortcuts, with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/in-app-promo-sdk">In-App Promo SDK</a> you can proactively suggest shortcuts in your app for actions that the user can repeat with a voice command to Assistant, in beta. The SDK allows you to check if the shortcut you want to suggest already exists for that user and prompt the user to create the suggested shortcut. </p> <h3>Google Assistant plugin for Android Studio </h3> <p> To support testing Capabilities, <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/test-tool">Google Assistant plugin</a> for Android Studio was launched. It contains an updated App Action Test Tool that creates a preview of your App Action, so you can test an integration before publishing it to the Play store. </p> <h3>New App Actions resources</h3> <p> Learn more with new or updated content: </p> <ul> <li>Updated and new <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/app/overview">Documentation</a>, including a new <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=DozT--NclbM">App Action Overview Video</a> <li>New <a href="https://web.archive.org/web/20210720135936/https://codelabs.developers.google.com/codelabs/appactions-beta">beta codelab</a> that walks you through adding two common BIIs using capabilities defined in shortcuts.xml <li>9 new videos on the <a href="https://web.archive.org/web/20210720135936/http://goo.gle/assistant-app-videos">App Actions Playlist</a>, which include <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=vp8X0BpheY0&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=7">How to voicify your Android app</a> and <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=zMs7DgniUqs&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=8">Android shortcuts for Assistant</a> sessions, <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=kqBboR-5YeE&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=4">App Actions AMA</a>, short 2 min demos of <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=lxviLXXvs3A&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=6">How to create your first App Action</a> and <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=lNFxidfuz0w&list=PLOU2XLYxmsILJWy1k3BO7dScDSPL4KM2e&index=5">App Actions test tool</a> </li> </ul> <h2><strong>Conversational Actions</strong> </h2> <p> During the <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=O2gCx_iX2vQ">What's New in Google Assistant</a> keynote, Director of Product for the Google Assistant Developer Platform Rebecca Nathenson mentioned several coming updates and changes for Conversational Actions. </p> <h3>Updates to Interactive Canvas</h3> <p> Over the coming weeks, we’ll introduce new functionality to Interactive Canvas. Canvas developers will be able to manage intent fulfillment client-side, removing the need for intermediary webhooks in some cases. For use cases which require server-side fulfillment, like transactions and account linking, developers will be able to opt-in to server-side fulfillment as needed.<br><br>We’re also introducing a new function, <code>outputTts()</code>, which allows you to trigger Text to Speech client-side. This should help reduce latency for end users. </p> <p> Additionally, there will be updates to the APIs available to get and set storage for both the home and individual users, allowing for client-side storage of user information. You’ll be able to persist user information within your web app, which was previously only available for access by webhook. </p> <p> <br>These new features for Interactive Canvas will be made available soon as part of a developer preview for Conversational Actions Developers. For more details on these new features, check out the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/interactivecanvas/preview">preview page</a>. </p> <h3>Updates to Transaction UX for Smart Displays</h3> <p> Also coming soon to Conversational Actions - we’re updating the workflow for completing transactions, allowing users to complete transactions from their smart screens, by confirming the CVC code from their chosen payment method. Watch our <a href="https://web.archive.org/web/20210720135936/https://youtu.be/z6l-V-EOGNY">demo video showing new transaction features on smart devices</a> to get a feel for these changes. </p> <h3>Tips on Launching your Conversational Action</h3> <p> Make sure to catch our technical session <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=V2izYekSSwY">Driving a successful launch for Conversational Actions</a> to learn about some strategies for putting together a marketing team and go-to-market plan for releasing your Conversational Action. </p> <h3>AMA: Games on Google Assistant</h3> <p> If you’re interested in building Games for Google Assistant with Conversational Actions, you should <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=nOP-3EYaad8">check out the recording</a> of our AMA, where Googlers answered questions from I/O attendees about designing, building, and launching games. </p> <h2><br><strong>Smart Home Actions</strong> </h2> <p> The <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=fWMDkIziINQ">What's new in Smart Home</a> keynote covered several updates for Smart Home Actions. Following our continued emphasis on quality smart home integrations with the updated policy launch, we added new features to help you build engaging, reliable Actions for your users. </p> <h3>Test Suite and Analytics</h3> <p> The updated <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/tools/smart-home-test-suite">Test Suite for Smart Home</a> now supports automatic testing, without the use of TTS. Additionally, the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/monitoring-logging">Analytics</a> dashboards have been expanded with more detailed logs and in-depth error reporting to help you more quickly identify any potential issues with your Action. For a deeper dive into these enhancements, try out the <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=dXrKSNJA0cw">Debugging the Smart Home</a> workshop. There are also two new debugging <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/codelabs">codelabs</a> to help you get more familiar with using these tools to improve the quality of your Action. </p> <h3>Notifications</h3> <p> We expanded support for proactive <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/notifications">notifications</a> to include the device traits RunCycle and SensorState. Users can now be proactively notified for multiple different device events. We also announced the release of follow-up responses. These follow-up responses enable your smart devices to notify users asynchronously to device changes succeeding or failing. </p> <h3>WebRTC</h3> <p> We added support for <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/traits/eap/camerastream#webrtc">WebRTC</a> to the CameraStream trait. Smart camera users can now benefit from lower latency and half-duplex talk between devices. As mentioned in the keynote, we will also be making updates to the other currently supported protocols for smart cameras. </p> <h3>Bluetooth Seamless Setup</h3> <p> To improve the on-boarding experience, developers can now enable BLE (bluetooth low energy) for device onboarding with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/smarthome/develop/seamless-setup">Bluetooth Seamless Setup</a>. Google Home and Nest devices can act as local hubs to provision and register nearby devices for any Action configured with local fulfillment. </p> <h3>Matter</h3> <p> Project CHIP has officially rebranded as <a href="https://web.archive.org/web/20210720135936/https://buildwithmatter.com/">Matter</a>. Once the IP-based connectivity protocol officially launches, we will be supporting devices running the protocol. Watch the <a href="https://web.archive.org/web/20210720135936/https://events.google.com/io/session/a33eb15c-bdd4-41a4-a1af-9c3ba446e515">Getting started with Project CHIP</a><span style="text-decoration:underline;"> </span>tech session to learn more. </p> <h2>Ecosystem and Community</h2> <h3>The women building voice AI and their role in the voice revolution</h3> <p> Voice AI is fundamentally changing how we interact with technology and its future will be a product of the people that build it. Watch this <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=NV5SQzScn_8">session</a> to hear about the talented women shaping the Voice AI field, including an interview with Lilian Rincon, Sr. Director of Product Management at Google. Leslie also discusses strategies for achieving equal gender representation in Voice AI, an ambitious but essential goal. </p> <h3>AMA: How the Assistant Investment Program can help fund your startup</h3> <p> This "Ask Me Anything" session was hosted by the all-star team who runs the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/accelerators/voice">Google for Startups Accelerator: Voice AI</a>. The team fielded questions from startups and investors around the world who are interested in building businesses based on voice technology. Check out the recording of this event <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=QmLJr__vRtA">here</a>. The day after the AMA session, the 2021 cohort for the Voice AI accelerator had their demo day - you can catch the recording of their presentations <a href="https://web.archive.org/web/20210720135936/https://www.youtube.com/watch?v=-rxsBnjELlM">here</a>. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-OjIl3pPbYJQ/YN4nojQwC_I/AAAAAAAAKaQ/JVY2YBD_IM8lNkd_bfyKntObNAOmfvGUACLcBGAsYHQ/s0/GD%2BBLOG%2BRecap%2Bof%2BAssistant%2B3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from the AMA titled: How the Assistant Investment Program can help fund your startup" border="0" data-original-height="634" data-original-width="1038" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-OjIl3pPbYJQ/YN4nojQwC_I/AAAAAAAAKaQ/JVY2YBD_IM8lNkd_bfyKntObNAOmfvGUACLcBGAsYHQ/s0/GD%2BBLOG%2BRecap%2Bof%2BAssistant%2B3.png" style="width:75%"/></a></div> <h3>Women in Voice Meetup</h3> <p> We connected with amazing women in Voice AI and discussed ways allies can help women in Voice to be more successful while building a more inclusive ecosystem. It was hosted by <a href="https://web.archive.org/web/20210720135936/https://twitter.com/Smutzla">Leslie Garcia-Amaya</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/chatasweetie">Jessica Dene Earley-Cha</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/LaKariAlarcon">Karina Alarcon</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/irreverentmike">Mike Bifulco</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/cpearl42">Cathy Pearl</a>, <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ToniCorinne">Toni Klopfenstein</a>, <a href="https://web.archive.org/web/20210720135936/https://www.linkedin.com/in/shikhakapoor/">Shikha Kapoor</a> & <a href="https://web.archive.org/web/20210720135936/https://www.linkedin.com/in/walquiriasaad/">Walquiria Saad</a> </p> <h3>Smart home developer Meetups </h3> <p> One of the perks of I/O being virtual this year was the ability to connect with students, hobbyists, and developers around the globe to discuss the current state of Smart Home, as well as some of the upcoming features. We hosted 3 meetups for the APAC, Americas, and EMEA regions and gathered some great feedback from the community. </p> <h3>Assistant Google Developers Experts Meetup</h3> <p> Every year we host an <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/assistant/community/gde">Assistant Google Developer Expert</a> meetup to connect and share knowledge. This year we were able to invite everyone who is interested in building for Google Assistant to network and connect with one another. At the end several attendees came together at the Assistant Sandbox for a virtual photo! </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of GoogleIO assitant meetup" border="0" data-original-height="527" data-original-width="696" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-UeYIN29h3Qk/YN4se2OKInI/AAAAAAAAKag/1qVdbH7boiA9YLWSeoyK6BKA7wBe591sgCLcBGAsYHQ/s0/gde.png" style="width:80%"/></a></div> <p> <em>Thanks for reading! To share your thoughts or questions, join us on Reddit at <a href="https://web.archive.org/web/20210720135936/https://www.reddit.com/r/GoogleAssistantDev/">r/GoogleAssistantDev</a>. </em> </p> <p> <em>Follow <a href="https://web.archive.org/web/20210720135936/https://twitter.com/ActionsOnGoogle">@ActionsOnGoogle</a> on Twitter for more of our team's updates, and tweet using #AoGDevs to share what you’re working on. Can’t wait to see what you build!</em> </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Assistant Recap Google I/O 2021&url=https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html" data-url="https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/07/assistant-recap-google-io-2021.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/actions%20on%20google" rel="tag"> actions on google </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AppActions" rel="tag"> AppActions </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20assistant" rel="tag"> google assistant </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20I%2FO" rel="tag"> Google I/O </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Smart%20Home" rel="tag"> Smart Home </a> </span> </div> </div> </div> <div class="post" data-id="4401054792501670995" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html" itemprop="url" title="Bringing artworks to life with AR"> Bringing artworks to life with AR </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Thursday, July 1, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="display:none"> <p><em>Posted by Richard Adem, UX Engineer at Google Arts & Culture </em><p> <h2>What is Art Filter?</h2> <p> One of the best ways to learn about global culture is by trying on famous art pieces using <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/ar">Google’s Augmented Reality technology</a> on your mobile device. What does it feel like to wear a three thousand year old necklace, put on a sixteenth century Japanese helmet or don pearl earrings and pose in a Vermeer? </p> <p> <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/">Google Arts & Culture</a> have created a new feature called Art Filter allowing everyone to learn about culturally significant art pieces from around the world and put themselves inside famous paintings, normally safely displayed in a museum. </p> <p> We teamed up with the <a href="https://web.archive.org/web/20210720135936/https://www.mediapipe.dev/">MediaPipe</a> team, which offers cross-platform, customizable ML solutions to combine ML with rendering to generate stunning visuals. </p> <p> Working closely with the MediaPipe team to utilize their <a href="https://web.archive.org/web/20210720135936/https://solutions.mediapipe.dev/face_mesh">face mesh</a> and <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/09/mediapipe-3d-face-transform.html">3D face transform</a> allowed us to create custom effects for each of the artifacts we had chosen, and easily display them on as part of the Google Arts & Culture iOS and Android app. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of the art filter feature" border="0" data-original-height="1000" data-original-width="1000" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 1. The Art Filter feature. </p> </center> <h2>The Challenges</h2> <p> We selected five iconic cultural treasures from around the world: </p> <ul> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/self-portrait-with-monkey-frida-kahlo/QQFgbijSsKxTzg">Frida Kahlo Self-Portrait with Monkey</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/helmet-with-tengu-mask-and-crows/vAGAvv_qfUCBnA">Helmet with Tengu Mask and Crows</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/self-portrait/9gFw_1Vou2CkwQ">Vincent van Gogh Self-Portrait 1889</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/faience-collar-necklace-unknown/awEpOm0r3gb0RA">Faience collar necklace 1352-1327 BC</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/girl-with-a-pearl-earring-johannes-vermeer/3QFHLJgXCmQm2Q">Johannes Vermeer Girl with a Pearl Earring</a> </li> </ul> <p> Given their diverse formats or textures each artwork or object required special approaches to bring it to life in AR. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-exz3LSp5_60/YNuuhcBGrdI/AAAAAAAAKZg/aoZOvrIeEasQC4bffAa1g2m7DtpR0PayACLcBGAsYHQ/s0/figure%2B2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of user wearing jewelry on art filter feature" border="0" data-original-height="504" data-original-width="374" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-exz3LSp5_60/YNuuhcBGrdI/AAAAAAAAKZg/aoZOvrIeEasQC4bffAa1g2m7DtpR0PayACLcBGAsYHQ/s0/figure%2B2.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 2. User wearing the jewelry from <a href="https://web.archive.org/web/20210720135936/https://www.google.com/url?q=https://artsandculture.google.com/asset/girl-with-a-pearl-earring-johannes-vermeer/3QFHLJgXCmQm2Q&sa=D&source=editors&ust=1620679700024000&usg=AOvVaw03Qd48Y0K1p5jdLuyexdD2">Johannes Vermeer's "Girl with a Pearl Earring"</a> - Mauritshuis museum, Hague. </p> </center> <h3>Creating 3D objects that can be viewed from all sides, using 2D references.</h3> <p> Some of the artwork we selected are 2D paintings and we wanted everyone to immerse themselves in the paintings. Our team of 3D artists and designers took high resolution <a href="https://web.archive.org/web/20210720135936/https://blog.google/outreach-initiatives/arts-culture/art-camera-cultural-institute/">gigapixel images</a> from Google Arts & Culture and projected them onto 3D meshes to texture them. We also extended the 2D textures all the way around the 3D meshes while maintaining the style of the original artist. This means that when you turn your head the previously hidden parts of the piece are viewable from every angle, mimicking how the object would look in real-life. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-72EOC9NhsDo/YNuvcGgAbOI/AAAAAAAAKZo/-Dmh9tm3fN0iKBPz8b_iFC3A6JBRLcsKgCLcBGAsYHQ/s0/Figure%2B3.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Gif of the Van Gogh Self-Portrait filter" border="0" data-original-height="512" data-original-width="392" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-72EOC9NhsDo/YNuvcGgAbOI/AAAAAAAAKZo/-Dmh9tm3fN0iKBPz8b_iFC3A6JBRLcsKgCLcBGAsYHQ/s0/Figure%2B3.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 3. The Van Gogh Self-Portrait filter - Musée d’Orsay, Paris. </p> </center> <p> Our cultural partners were immensely helpful during the creation of Art Filter. They have sourced a huge amount of reference images allowing us to reproduce the pieces accurately using photographs from different angles, to help them appear to fit into the “real world” in AR (using size comparisons). </p> <h3>Layering elements of the effect along with the image of the user.</h3> <p> Art Filter takes an image of the user from their device’s camera and uses that to generate a 3D mesh of the user’s face. All processing of user images or video feeds is run entirely on device. We <span style="text-decoration:underline;">do not</span> use this feature to identify or collect any personal biometric data; the feature cannot be used to identify an individual. </p> <p> The image is then reused to texture the face mesh, generated in real-time on-device with <a href="https://web.archive.org/web/20210720135936/https://solutions.mediapipe.dev/face_mesh">MediaPipe Face Mesh</a>, representing it in the virtual 3D world within the device. We then add virtual 2D and 3D layers around the face to complete the effect. The Tengu Helmet, for example, sits on top of the face mesh in 3D and is “attached” to the face mesh so it moves around when the user moves their head around. The Vermeer earrings with a headscarf and Frida Kahlo’s necklace are attached to the user’s image in a similar way. The Van Gogh effect works slightly differently since we still use a mesh of the user’s face but this time we apply a texture from the painting. </p> <p> We use 2D elements to complete the scene as well, such as the backgrounds in the Kahlo and Van Gogh paintings. These were created by carefully separating the painting subjects from the background then placing them behind the user in 3D. You may notice that Van Gogh’s body is also 2D, shown as a “billboard” so that it always faces the camera. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-42Hv4eoazlg/YNuwDHxnXaI/AAAAAAAAKZw/pEykwoFs1yAbHcaic9v2czmTvoHvcczlgCLcBGAsYHQ/s0/Figure%2B4.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Figure 4. Creating the 3D mesh showing layers and masks." border="0" data-original-height="1582" data-original-width="1296" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-42Hv4eoazlg/YNuwDHxnXaI/AAAAAAAAKZw/pEykwoFs1yAbHcaic9v2czmTvoHvcczlgCLcBGAsYHQ/s0/Figure%2B4.png" style="width:80%"/></a></div> <p id="imgCaption"> Figure 4. Creating the 3D mesh showing layers and masks. </p> </center> <h3>Using shaders for different materials such as the metal helmet.</h3> <p> To create a realistic looking material we used “Physically Based” Rendering shaders. You can see this on the Tengu helmet, it has a bumpy surface that is affected by the real life light captured by the device. This requires creating extra textures, texture maps, for the effect that uses colors to represent how bumpy or shiny the 3D object should appear. Texture maps look like bright pink and blue images but tell the renderer about tiny details on the surface of the object without creating any extra polygons, which can slow down the frame rate of the feature. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XHosUaDc4vI/YNuw1InDRpI/AAAAAAAAKZ4/eZN3fxY_7CEa9x1Vz7Wgsxs3A0xZPJ_KgCLcBGAsYHQ/s0/Figure%2B5.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Figure 5. User wearing Helmet with Tengu Mask and Crows - The Metropolitan Museum of Art " border="0" data-original-height="1324" data-original-width="886" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XHosUaDc4vI/YNuw1InDRpI/AAAAAAAAKZ4/eZN3fxY_7CEa9x1Vz7Wgsxs3A0xZPJ_KgCLcBGAsYHQ/s0/Figure%2B5.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 5. User wearing Helmet with Tengu Mask and Crows - The Metropolitan Museum of Art. </p> </center> <h2>Conclusion</h2> <p> We hope you enjoy the collection we have created in <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/art-filter">Art Filter</a>. Please visit and try for yourself! You can also explore more amazing ML features with Google Arts & Culture such as <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/selfie">Art Selfie</a> and <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/art-transfer">Art Transfer</a>. </p> <p> We hope to bring many more filters to the feature and are looking forward to new features from <a href="https://web.archive.org/web/20210720135936/https://mediapipe.dev">MediaPipe</a>. </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="display:none"> <p><em>Posted by Richard Adem, UX Engineer at Google Arts & Culture </em><p> <h2>What is Art Filter?</h2> <p> One of the best ways to learn about global culture is by trying on famous art pieces using <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/ar">Google’s Augmented Reality technology</a> on your mobile device. What does it feel like to wear a three thousand year old necklace, put on a sixteenth century Japanese helmet or don pearl earrings and pose in a Vermeer? </p> <p> <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/">Google Arts & Culture</a> have created a new feature called Art Filter allowing everyone to learn about culturally significant art pieces from around the world and put themselves inside famous paintings, normally safely displayed in a museum. </p> <p> We teamed up with the <a href="https://web.archive.org/web/20210720135936/https://www.mediapipe.dev/">MediaPipe</a> team, which offers cross-platform, customizable ML solutions to combine ML with rendering to generate stunning visuals. </p> <p> Working closely with the MediaPipe team to utilize their <a href="https://web.archive.org/web/20210720135936/https://solutions.mediapipe.dev/face_mesh">face mesh</a> and <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/09/mediapipe-3d-face-transform.html">3D face transform</a> allowed us to create custom effects for each of the artifacts we had chosen, and easily display them on as part of the Google Arts & Culture iOS and Android app. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of the art filter feature" border="0" data-original-height="1000" data-original-width="1000" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-vCCOGLacIbQ/YNutxhUbVGI/AAAAAAAAKZY/khowTJ96t0c2UFn_DJdFNQWbiLJ4MaTBgCLcBGAsYHQ/s0/figure%2B1.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 1. The Art Filter feature. </p> </center> <h2>The Challenges</h2> <p> We selected five iconic cultural treasures from around the world: </p> <ul> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/self-portrait-with-monkey-frida-kahlo/QQFgbijSsKxTzg">Frida Kahlo Self-Portrait with Monkey</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/helmet-with-tengu-mask-and-crows/vAGAvv_qfUCBnA">Helmet with Tengu Mask and Crows</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/self-portrait/9gFw_1Vou2CkwQ">Vincent van Gogh Self-Portrait 1889</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/faience-collar-necklace-unknown/awEpOm0r3gb0RA">Faience collar necklace 1352-1327 BC</a> <li><a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/asset/girl-with-a-pearl-earring-johannes-vermeer/3QFHLJgXCmQm2Q">Johannes Vermeer Girl with a Pearl Earring</a> </li> </ul> <p> Given their diverse formats or textures each artwork or object required special approaches to bring it to life in AR. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-exz3LSp5_60/YNuuhcBGrdI/AAAAAAAAKZg/aoZOvrIeEasQC4bffAa1g2m7DtpR0PayACLcBGAsYHQ/s0/figure%2B2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="gif of user wearing jewelry on art filter feature" border="0" data-original-height="504" data-original-width="374" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-exz3LSp5_60/YNuuhcBGrdI/AAAAAAAAKZg/aoZOvrIeEasQC4bffAa1g2m7DtpR0PayACLcBGAsYHQ/s0/figure%2B2.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 2. User wearing the jewelry from <a href="https://web.archive.org/web/20210720135936/https://www.google.com/url?q=https://artsandculture.google.com/asset/girl-with-a-pearl-earring-johannes-vermeer/3QFHLJgXCmQm2Q&sa=D&source=editors&ust=1620679700024000&usg=AOvVaw03Qd48Y0K1p5jdLuyexdD2">Johannes Vermeer's "Girl with a Pearl Earring"</a> - Mauritshuis museum, Hague. </p> </center> <h3>Creating 3D objects that can be viewed from all sides, using 2D references.</h3> <p> Some of the artwork we selected are 2D paintings and we wanted everyone to immerse themselves in the paintings. Our team of 3D artists and designers took high resolution <a href="https://web.archive.org/web/20210720135936/https://blog.google/outreach-initiatives/arts-culture/art-camera-cultural-institute/">gigapixel images</a> from Google Arts & Culture and projected them onto 3D meshes to texture them. We also extended the 2D textures all the way around the 3D meshes while maintaining the style of the original artist. This means that when you turn your head the previously hidden parts of the piece are viewable from every angle, mimicking how the object would look in real-life. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-72EOC9NhsDo/YNuvcGgAbOI/AAAAAAAAKZo/-Dmh9tm3fN0iKBPz8b_iFC3A6JBRLcsKgCLcBGAsYHQ/s0/Figure%2B3.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Gif of the Van Gogh Self-Portrait filter" border="0" data-original-height="512" data-original-width="392" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-72EOC9NhsDo/YNuvcGgAbOI/AAAAAAAAKZo/-Dmh9tm3fN0iKBPz8b_iFC3A6JBRLcsKgCLcBGAsYHQ/s0/Figure%2B3.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 3. The Van Gogh Self-Portrait filter - Musée d’Orsay, Paris. </p> </center> <p> Our cultural partners were immensely helpful during the creation of Art Filter. They have sourced a huge amount of reference images allowing us to reproduce the pieces accurately using photographs from different angles, to help them appear to fit into the “real world” in AR (using size comparisons). </p> <h3>Layering elements of the effect along with the image of the user.</h3> <p> Art Filter takes an image of the user from their device’s camera and uses that to generate a 3D mesh of the user’s face. All processing of user images or video feeds is run entirely on device. We <span style="text-decoration:underline;">do not</span> use this feature to identify or collect any personal biometric data; the feature cannot be used to identify an individual. </p> <p> The image is then reused to texture the face mesh, generated in real-time on-device with <a href="https://web.archive.org/web/20210720135936/https://solutions.mediapipe.dev/face_mesh">MediaPipe Face Mesh</a>, representing it in the virtual 3D world within the device. We then add virtual 2D and 3D layers around the face to complete the effect. The Tengu Helmet, for example, sits on top of the face mesh in 3D and is “attached” to the face mesh so it moves around when the user moves their head around. The Vermeer earrings with a headscarf and Frida Kahlo’s necklace are attached to the user’s image in a similar way. The Van Gogh effect works slightly differently since we still use a mesh of the user’s face but this time we apply a texture from the painting. </p> <p> We use 2D elements to complete the scene as well, such as the backgrounds in the Kahlo and Van Gogh paintings. These were created by carefully separating the painting subjects from the background then placing them behind the user in 3D. You may notice that Van Gogh’s body is also 2D, shown as a “billboard” so that it always faces the camera. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-42Hv4eoazlg/YNuwDHxnXaI/AAAAAAAAKZw/pEykwoFs1yAbHcaic9v2czmTvoHvcczlgCLcBGAsYHQ/s0/Figure%2B4.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Figure 4. Creating the 3D mesh showing layers and masks." border="0" data-original-height="1582" data-original-width="1296" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-42Hv4eoazlg/YNuwDHxnXaI/AAAAAAAAKZw/pEykwoFs1yAbHcaic9v2czmTvoHvcczlgCLcBGAsYHQ/s0/Figure%2B4.png" style="width:80%"/></a></div> <p id="imgCaption"> Figure 4. Creating the 3D mesh showing layers and masks. </p> </center> <h3>Using shaders for different materials such as the metal helmet.</h3> <p> To create a realistic looking material we used “Physically Based” Rendering shaders. You can see this on the Tengu helmet, it has a bumpy surface that is affected by the real life light captured by the device. This requires creating extra textures, texture maps, for the effect that uses colors to represent how bumpy or shiny the 3D object should appear. Texture maps look like bright pink and blue images but tell the renderer about tiny details on the surface of the object without creating any extra polygons, which can slow down the frame rate of the feature. </p> <center><div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XHosUaDc4vI/YNuw1InDRpI/AAAAAAAAKZ4/eZN3fxY_7CEa9x1Vz7Wgsxs3A0xZPJ_KgCLcBGAsYHQ/s0/Figure%2B5.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Figure 5. User wearing Helmet with Tengu Mask and Crows - The Metropolitan Museum of Art " border="0" data-original-height="1324" data-original-width="886" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-XHosUaDc4vI/YNuw1InDRpI/AAAAAAAAKZ4/eZN3fxY_7CEa9x1Vz7Wgsxs3A0xZPJ_KgCLcBGAsYHQ/s0/Figure%2B5.gif" style="width:80%"/></a></div> <p id="imgCaption"> Figure 5. User wearing Helmet with Tengu Mask and Crows - The Metropolitan Museum of Art. </p> </center> <h2>Conclusion</h2> <p> We hope you enjoy the collection we have created in <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/art-filter">Art Filter</a>. Please visit and try for yourself! You can also explore more amazing ML features with Google Arts & Culture such as <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/selfie">Art Selfie</a> and <a href="https://web.archive.org/web/20210720135936/https://artsandculture.google.com/camera/art-transfer">Art Transfer</a>. </p> <p> We hope to bring many more filters to the feature and are looking forward to new features from <a href="https://web.archive.org/web/20210720135936/https://mediapipe.dev/">MediaPipe</a>. </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Bringing artworks to life with AR&url=https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html" data-url="https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/07/bringing-artworks-to-life-with-ar.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Art" rel="tag"> Art </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Arts%20%26%20Culture" rel="tag"> Google Arts & Culture </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MediaPipe" rel="tag"> MediaPipe </a> </span> </div> </div> </div> <div class="post" data-id="5564891706785961603" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html" itemprop="url" title="Google updates Passes API to store COVID vaccination and testing information on Android devices"> Google updates Passes API to store COVID vaccination and testing information on Android devices </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Wednesday, June 30, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="display:none"> <p><em>Posted by Irfan Faizullabhoy </em><p> <p> Google has updated its <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/pay/passes">Passes API</a> to enable a simple and secure way to store and access COVID vaccination and test cards on Android devices. Starting today, developers from healthcare organizations, government agencies and organizations authorized by public health authorities to distribute COVID vaccines and/or tests will have access to these APIs to create a digital version of COVID vaccination or test information. This will roll out initially in the United States followed by other countries. </p> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of three smart phones side by side showing Covid vaccination cards" border="0" data-original-height="1120" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="width:100%"/></a></div> <p id="imgCaption"> Example COVID Cards from Healthvana, a company serving Los Angeles County </p> </center> <p> Once a user stores the digital version of the COVID Card to their device, they will be able to access it via a shortcut on their device home screen, even when they are offline or in areas that have weak internet service. To use this feature, the device needs to run Android 5 or later and be <a href="https://web.archive.org/web/20210720135936/https://support.google.com/googleplay/answer/7165974">Play Protect certified</a>. Installing the Google Pay app is not a requirement to access COVID Cards. </p> <p> The COVID Card has been designed with privacy and security at its core. </p> <ul> <li><strong>Storing information:</strong> The user’s COVID vaccination and test information is stored on their Android device. If a user wants to access this information on multiple devices, the user will need to manually store it on each device. Google does not retain a copy of the user’s COVID vaccination or test information. <li><strong>Sharing information:</strong> Users can choose to show their COVID Card to others. The information in the user’s COVID Card is not shared by Google with its various services or third parties and it is not used for targeting ads. <li><strong>Securing information:</strong> A lock screen is required in order to store a COVID Card on a device. This is for added security and to protect the user’s personal information. When a user wants to access their COVID Card, they will be asked for the password, pin or biometric method set up for their Android device. </li> </ul> <p> If you are a qualified provider, please sign up to share your interest <a href="https://web.archive.org/web/20210720135936/http://support.google.com/pay/merchants/contact/instore_merchants ">here</a>. And, for more information about COVID cards and their privacy and security features, please see the <a href="https://web.archive.org/web/20210720135936/https://support.google.com/pay/answer/10890261">help center</a>. </p> <p> <strong>What do you think?</strong> </p> <p> Do you have any questions? Let us know in the comments below or tweet using <strong>#AskGooglePayDevs and follow us <a href="https://web.archive.org/web/20210720135936/https://twitter.com/googlepaydevs">@GooglePayDevs</a>.</strong> </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="display:none"> <p><em>Posted by Irfan Faizullabhoy </em><p> <p> Google has updated its <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/pay/passes">Passes API</a> to enable a simple and secure way to store and access COVID vaccination and test cards on Android devices. Starting today, developers from healthcare organizations, government agencies and organizations authorized by public health authorities to distribute COVID vaccines and/or tests will have access to these APIs to create a digital version of COVID vaccination or test information. This will roll out initially in the United States followed by other countries. </p> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image of three smart phones side by side showing Covid vaccination cards" border="0" data-original-height="1120" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-XFeiNnY2l9M/YNtfTo9kt5I/AAAAAAAAKZA/XMUI8HFkIScYwoFDOxPT68hozB7NYYBoQCLcBGAsYHQ/s0/%255BGD%2BBLOG%255D%2BCovid%2Bcards%2B1.png" style="width:100%"/></a></div> <p id="imgCaption"> Example COVID Cards from Healthvana, a company serving Los Angeles County </p> </center> <p> Once a user stores the digital version of the COVID Card to their device, they will be able to access it via a shortcut on their device home screen, even when they are offline or in areas that have weak internet service. To use this feature, the device needs to run Android 5 or later and be <a href="https://web.archive.org/web/20210720135936/https://support.google.com/googleplay/answer/7165974">Play Protect certified</a>. Installing the Google Pay app is not a requirement to access COVID Cards. </p> <p> The COVID Card has been designed with privacy and security at its core. </p> <ul> <li><strong>Storing information:</strong> The user’s COVID vaccination and test information is stored on their Android device. If a user wants to access this information on multiple devices, the user will need to manually store it on each device. Google does not retain a copy of the user’s COVID vaccination or test information. <li><strong>Sharing information:</strong> Users can choose to show their COVID Card to others. The information in the user’s COVID Card is not shared by Google with its various services or third parties and it is not used for targeting ads. <li><strong>Securing information:</strong> A lock screen is required in order to store a COVID Card on a device. This is for added security and to protect the user’s personal information. When a user wants to access their COVID Card, they will be asked for the password, pin or biometric method set up for their Android device. </li> </ul> <p> If you are a qualified provider, please sign up to share your interest <a href="https://web.archive.org/web/20210720135936/http://support.google.com/pay/merchants/contact/instore_merchants ">here</a>. And, for more information about COVID cards and their privacy and security features, please see the <a href="https://web.archive.org/web/20210720135936/https://support.google.com/pay/answer/10890261">help center</a>. </p> <p> <strong>What do you think?</strong> </p> <p> Do you have any questions? Let us know in the comments below or tweet using <strong>#AskGooglePayDevs and follow us <a href="https://web.archive.org/web/20210720135936/https://twitter.com/googlepaydevs">@GooglePayDevs</a>.</strong> </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Google updates Passes API to store COVID vaccination and testing information on Android devices&url=https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html" data-url="https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/06/google-updates-passes-api-to-save-covid-testing-and-vaccination-information-on-Android-devices.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Digital%20wallet" rel="tag"> Digital wallet </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay" rel="tag"> google pay </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Pay%20Developers" rel="tag"> Google Pay Developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/online%20payments" rel="tag"> online payments </a> </span> </div> </div> </div> <div class="post" data-id="1324464366121282127" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html" itemprop="url" title="Upcoming security changes to Google's OAuth 2.0 authorization endpoint in embedded webviews"> Upcoming security changes to Google's OAuth 2.0 authorization endpoint in embedded webviews </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Tuesday, June 29, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-zAJk9L3Lwi0/YNtpq1hay3I/AAAAAAAAKZI/Rlb8p9QmtFAR5MPwwOmbOqO05IPzUirLwCLcBGAsYHQ/s0/Embedded_Webview_Deprecation_1.jpeg"> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-zAJk9L3Lwi0/YNtpq1hay3I/AAAAAAAAKZI/Rlb8p9QmtFAR5MPwwOmbOqO05IPzUirLwCLcBGAsYHQ/s0/Embedded_Webview_Deprecation_1.jpeg" style="display:none"> <p> Posted by Badi Azad, Group Product Manager (<a href="https://web.archive.org/web/20210720135936/https://twitter.com/badiazad">@badiazad</a>) </p> <p> The Google Identity team is continually working to improve Google Account security and create a safer and more secure experience for our users. As part of that work, we recently introduced a new <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> prohibiting Google OAuth requests in embedded browser libraries commonly referred to as embedded webviews. All embedded webviews will be blocked starting on <strong>September 30, 2021</strong>. </p> <p> Embedded webview libraries are problematic because they allow a nefarious developer to intercept and alter communications between Google and its users by acting as a "<a href="https://web.archive.org/web/20210720135936/https://wikipedia.org/wiki/Man-in-the-middle_attack">man in the middle</a>." An application embedding a webview can modify or intercept network requests, insert custom scripts that can potentially record every keystroke entered in a login form, access session cookies, or alter the content of the webpage. These libraries also allow the removal of key elements of a browser that hold user trust, such as the guarantee that the response originates from Google's servers, display of the website domain, and the ability to inspect the security of a connection. Additionally the <a href="https://web.archive.org/web/20210720135936/https://datatracker.ietf.org/doc/html/rfc8252#section-8.12">OAuth 2.0 for Native Apps</a> guidelines from IETF require that native apps must not use embedded user-agents such as webviews to perform authorization requests. </p> <p> Embedded webviews not only affect account security, they could affect usability of your application. The sandboxed storage environment of an embedded webview disconnects a user from the single sign-on features they expect from Google. A full-featured web browser supports multiple tools to help a logged-out user quickly sign-in to their account including password managers and <a href="https://web.archive.org/web/20210720135936/https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API">Web Authentication</a> libraries. Google's users also expect multiple-step login processes, including <a href="https://web.archive.org/web/20210720135936/https://www.google.com/landing/2step/">two-step verification</a> and <a href="https://web.archive.org/web/20210720135936/https://support.google.com/families/answer/9204736">child account authorizations</a>, to function seamlessly when a login flow involves multiple devices, when switching to another app on the device, or when communicating with peripherals such as a security key. </p> <h1 id="instructions"><a href="#instructions">Instructions for impacted developers </a></h1> <p> Developers must register an appropriate OAuth client for each platform (Desktop, Android, iOS, etc.) on which your app will run, in compliance with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#register">Google's OAuth 2.0 Policies</a>. You can verify the OAuth client ID used by your installed application is the most appropriate choice for your platform by visiting the Google API Console's <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/apis/credentials">Credentials page</a>. A "Web application" client type in use by an Android application is an example of mismatched use. Reference our <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/native-app">OAuth 2.0 for Mobile & Desktop Apps</a> guide to properly integrate the appropriate client for your app's platform. </p> <p> Applications opening all links and URLs inside an embedded webview should follow the following instructions for Android, iOS, macOS, and captive portals: </p> <h2 id="instructions-android"><a href="#instructions-android">Android </a></h2> <p> Embedded webviews implementing or extending <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/reference/android/webkit/WebView">Android WebView</a> do not comply with Google's <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> for its OAuth 2.0 Authorization Endpoint. Apps should allow general, third-party links to be handled by the default behaviors of the operating system, enabling a user's preferred routing to their chosen default web browser or another developer's preferred routing to its installed app through Android App Links. Apps may alternatively open general links to third-party sites in <a href="https://web.archive.org/web/20210720135936/https://developer.chrome.com/docs/android/custom-tabs/overview/">Android Custom Tabs</a>. </p> <h2 id="instructions-ios"><a href="#instructions-ios">iOS & macOS</a></h2> <p> Embedded webviews implementing or extending <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/webkit/wkwebview">WKWebView</a>, or the deprecated <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/uikit/uiwebview">UIWebView</a>, do not comply with Google's <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> for its OAuth 2.0 Authorization Endpoint. Apps should allow general, third-party links to be handled by the default behaviors of the operating system, enabling a user's preferred routing to their chosen default web browser or another developer's preferred routing to its installed app through Universal Links. Apps may alternatively open general links to third-party sites in <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller">SFSafariViewController</a>. </p> <h2 id="instructions-captive"><a href="#instructions-captive">Captive portals </a></h2> <p> If your computer network intercepts network requests, redirecting to a web portal supporting authorization with a Google Account, your web content could be displayed in an embedded webview controlled by a captive network assistant. You should provide potential viewers instructions on how to access your network using their default web browser. For more information reference the Google Account Help article <a href="https://web.archive.org/web/20210720135936/https://support.google.com/accounts/answer/9690282">Sign in to a Wi-Fi network with your Google Account</a>. </p> <p> New IETF standards adopted by Android and iOS may help users access your captive pages in a full-featured web browser. Captive networks should integrate <a href="https://web.archive.org/web/20210720135936/https://tools.ietf.org/html/rfc8910">Captive-Portal Identification in DHCP and Router Advertisements (RAs)</a> proposed IETF standard to inform clients that they are behind a captive portal enforcement device when joining the network, rather than relying on traffic interception. Networks should also integrate the <a href="https://web.archive.org/web/20210720135936/https://tools.ietf.org/html/rfc8908">Captive Portal API</a> proposed IETF standard to quickly direct clients to a required portal URL to access the Internet. For more information reference <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/about/versions/11/features/captive-portal">Captive portal API support for Android</a> and <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/news/?id=q78sq5rv">Apple's How to modernize your captive network</a> developer articles. </p> <h1 id="test"><a href="#test">Test for compatibility </a></h1> <p> If you're a developer that currently uses an embedded webview for Google OAuth 2.0 authorization flows, be aware that <strong>embedded webviews will be blocked as of September 30, 2021</strong>. To verify whether the authorization flow launched by your application is affected by these changes, test your application for compatibility and compliance with the policies outlined in this post. </p> <p> You can add a query parameter to your authorization request URI to test for potential impact to your application before September 30, 2021. The following steps describe how to adjust your current requests to Google's OAuth 2.0 Authorization Endpoint to include an additional query parameter for testing purposes. </p> <ol> <li>Go to where you send requests to Google's OAuth 2.0 Authorization Endpoint. Example URI: <code>https://accounts.google.com/o/oauth2/v2/auth</code> <li>Add the <code>disallow_webview</code> parameter with a value of <code>true</code> to the query component of the URI. Example: <code>disallow_webview=true</code> </li> </ol> <p> An implementation affected by the planned changes will see a <code>disallowed_useragent</code> error when loading Google's OAuth 2.0 Authorization Endpoint, with the <code>disallow_webview=true</code> query string, in an embedded webview instead of the authorization flows currently displayed. If you do not see an error message while testing the effect of the new embedded webview policies your app's implementation might not be impacted by this announcement. </p> <p> Note: A website's ability to request authorization from a Google Account may be impacted due to another developer's decision to use an embedded webview in their app. For example, if a messaging or news application opens links to your site in an embedded webview, the features available on your site, including Google OAuth 2.0 authorization flows, may be impacted. If your site or app is impacted by the implementation choice of another developer please contact that developer directly. </p> <h1 id="warning-message"><a href="#warning-message">User-facing warning message </a></h1> <p> A warning message may be displayed in non-compliant authorization requests after August 30, 2021. The warning message will include the user support email defined in your project's <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/apis/credentials/consent">OAuth consent screen in Google API Console</a> and direct the user to visit our <a href="https://web.archive.org/web/20210720135936/https://support.google.com/accounts/answer/7675428">Sign in with a supported browser</a> support article. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-4qdypG9Z6xU/YNOFfQqt9_I/AAAAAAAAKXQ/-Dh1LUVEGGUirv7q-E6kRi6iwoLBrcImQCLcBGAsYHQ/s0/Embedded%2BWebview%2BDeprecation%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="A screenshot showing an example Google OAuth authorization dialog including a warning message: To help protect your account, Google will soon block apps that don't comply with Google's embedded webview policy. You can let the app developer (moo@gmail.com) know that this app should stop using embedded webviews" border="0" data-original-height="1600" data-original-width="727" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-4qdypG9Z6xU/YNOFfQqt9_I/AAAAAAAAKXQ/-Dh1LUVEGGUirv7q-E6kRi6iwoLBrcImQCLcBGAsYHQ/s0/Embedded%2BWebview%2BDeprecation%2B1.png" style="width:50%;border:1px solid black;"/></a></div> <p> Developers may acknowledge the upcoming enforcement and suppress the warning message by passing a specific query parameter to the authorization request URI. The following steps explain how to adjust your authorization requests to include the acknowledgement parameter: </p> <ol> <li>Go to where you send requests to Google's OAuth 2.0 Authorization Endpoint. Example URI: <code>https://accounts.google.com/o/oauth2/v2/auth</code> <li>Add an <code>ack_webview_shutdown</code> parameter with a value of the enforcement date: <code>2021-09-30</code>. Example: <code>ack_webview_shutdown=2021-09-30</code> </li> </ol> <p> A successful request to Google's OAuth 2.0 Authorization Endpoint including the acknowledgement query parameter and enforcement date will suppress the warning message in non-compliant authorization requests. All non-compliant authorization requests will display a <code>disallowed_useragent</code> error when loading Google's OAuth 2.0 Authorization Endpoint after the enforcement date. </p> <h1>Related content</h1> <ul> <li><a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html">Google Developers - Modernizing OAuth interactions in Native Apps for Better Usability and Security</a> <li><a href="https://web.archive.org/web/20210720135936/https://security.googleblog.com/2019/04/better-protection-against-man-in-middle.html">Google Security Blog - Better protection against Man in the Middle phishing attacks</a> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-zAJk9L3Lwi0/YNtpq1hay3I/AAAAAAAAKZI/Rlb8p9QmtFAR5MPwwOmbOqO05IPzUirLwCLcBGAsYHQ/s0/Embedded_Webview_Deprecation_1.jpeg"> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-zAJk9L3Lwi0/YNtpq1hay3I/AAAAAAAAKZI/Rlb8p9QmtFAR5MPwwOmbOqO05IPzUirLwCLcBGAsYHQ/s0/Embedded_Webview_Deprecation_1.jpeg" style="display:none"> <p> Posted by Badi Azad, Group Product Manager (<a href="https://web.archive.org/web/20210720135936/https://twitter.com/badiazad">@badiazad</a>) </p> <p> The Google Identity team is continually working to improve Google Account security and create a safer and more secure experience for our users. As part of that work, we recently introduced a new <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> prohibiting Google OAuth requests in embedded browser libraries commonly referred to as embedded webviews. All embedded webviews will be blocked starting on <strong>September 30, 2021</strong>. </p> <p> Embedded webview libraries are problematic because they allow a nefarious developer to intercept and alter communications between Google and its users by acting as a "<a href="https://web.archive.org/web/20210720135936/https://wikipedia.org/wiki/Man-in-the-middle_attack">man in the middle</a>." An application embedding a webview can modify or intercept network requests, insert custom scripts that can potentially record every keystroke entered in a login form, access session cookies, or alter the content of the webpage. These libraries also allow the removal of key elements of a browser that hold user trust, such as the guarantee that the response originates from Google's servers, display of the website domain, and the ability to inspect the security of a connection. Additionally the <a href="https://web.archive.org/web/20210720135936/https://datatracker.ietf.org/doc/html/rfc8252#section-8.12">OAuth 2.0 for Native Apps</a> guidelines from IETF require that native apps must not use embedded user-agents such as webviews to perform authorization requests. </p> <p> Embedded webviews not only affect account security, they could affect usability of your application. The sandboxed storage environment of an embedded webview disconnects a user from the single sign-on features they expect from Google. A full-featured web browser supports multiple tools to help a logged-out user quickly sign-in to their account including password managers and <a href="https://web.archive.org/web/20210720135936/https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API">Web Authentication</a> libraries. Google's users also expect multiple-step login processes, including <a href="https://web.archive.org/web/20210720135936/https://www.google.com/landing/2step/">two-step verification</a> and <a href="https://web.archive.org/web/20210720135936/https://support.google.com/families/answer/9204736">child account authorizations</a>, to function seamlessly when a login flow involves multiple devices, when switching to another app on the device, or when communicating with peripherals such as a security key. </p> <h1 id="instructions"><a href="#instructions">Instructions for impacted developers </a></h1> <p> Developers must register an appropriate OAuth client for each platform (Desktop, Android, iOS, etc.) on which your app will run, in compliance with <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#register">Google's OAuth 2.0 Policies</a>. You can verify the OAuth client ID used by your installed application is the most appropriate choice for your platform by visiting the Google API Console's <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/apis/credentials">Credentials page</a>. A "Web application" client type in use by an Android application is an example of mismatched use. Reference our <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/native-app">OAuth 2.0 for Mobile & Desktop Apps</a> guide to properly integrate the appropriate client for your app's platform. </p> <p> Applications opening all links and URLs inside an embedded webview should follow the following instructions for Android, iOS, macOS, and captive portals: </p> <h2 id="instructions-android"><a href="#instructions-android">Android </a></h2> <p> Embedded webviews implementing or extending <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/reference/android/webkit/WebView">Android WebView</a> do not comply with Google's <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> for its OAuth 2.0 Authorization Endpoint. Apps should allow general, third-party links to be handled by the default behaviors of the operating system, enabling a user's preferred routing to their chosen default web browser or another developer's preferred routing to its installed app through Android App Links. Apps may alternatively open general links to third-party sites in <a href="https://web.archive.org/web/20210720135936/https://developer.chrome.com/docs/android/custom-tabs/overview/">Android Custom Tabs</a>. </p> <h2 id="instructions-ios"><a href="#instructions-ios">iOS & macOS</a></h2> <p> Embedded webviews implementing or extending <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/webkit/wkwebview">WKWebView</a>, or the deprecated <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/uikit/uiwebview">UIWebView</a>, do not comply with Google's <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/identity/protocols/oauth2/policies#browsers">secure browser policy</a> for its OAuth 2.0 Authorization Endpoint. Apps should allow general, third-party links to be handled by the default behaviors of the operating system, enabling a user's preferred routing to their chosen default web browser or another developer's preferred routing to its installed app through Universal Links. Apps may alternatively open general links to third-party sites in <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller">SFSafariViewController</a>. </p> <h2 id="instructions-captive"><a href="#instructions-captive">Captive portals </a></h2> <p> If your computer network intercepts network requests, redirecting to a web portal supporting authorization with a Google Account, your web content could be displayed in an embedded webview controlled by a captive network assistant. You should provide potential viewers instructions on how to access your network using their default web browser. For more information reference the Google Account Help article <a href="https://web.archive.org/web/20210720135936/https://support.google.com/accounts/answer/9690282">Sign in to a Wi-Fi network with your Google Account</a>. </p> <p> New IETF standards adopted by Android and iOS may help users access your captive pages in a full-featured web browser. Captive networks should integrate <a href="https://web.archive.org/web/20210720135936/https://tools.ietf.org/html/rfc8910">Captive-Portal Identification in DHCP and Router Advertisements (RAs)</a> proposed IETF standard to inform clients that they are behind a captive portal enforcement device when joining the network, rather than relying on traffic interception. Networks should also integrate the <a href="https://web.archive.org/web/20210720135936/https://tools.ietf.org/html/rfc8908">Captive Portal API</a> proposed IETF standard to quickly direct clients to a required portal URL to access the Internet. For more information reference <a href="https://web.archive.org/web/20210720135936/https://developer.android.com/about/versions/11/features/captive-portal">Captive portal API support for Android</a> and <a href="https://web.archive.org/web/20210720135936/https://developer.apple.com/news/?id=q78sq5rv">Apple's How to modernize your captive network</a> developer articles. </p> <h1 id="test"><a href="#test">Test for compatibility </a></h1> <p> If you're a developer that currently uses an embedded webview for Google OAuth 2.0 authorization flows, be aware that <strong>embedded webviews will be blocked as of September 30, 2021</strong>. To verify whether the authorization flow launched by your application is affected by these changes, test your application for compatibility and compliance with the policies outlined in this post. </p> <p> You can add a query parameter to your authorization request URI to test for potential impact to your application before September 30, 2021. The following steps describe how to adjust your current requests to Google's OAuth 2.0 Authorization Endpoint to include an additional query parameter for testing purposes. </p> <ol> <li>Go to where you send requests to Google's OAuth 2.0 Authorization Endpoint. Example URI: <code>https://accounts.google.com/o/oauth2/v2/auth</code> <li>Add the <code>disallow_webview</code> parameter with a value of <code>true</code> to the query component of the URI. Example: <code>disallow_webview=true</code> </li> </ol> <p> An implementation affected by the planned changes will see a <code>disallowed_useragent</code> error when loading Google's OAuth 2.0 Authorization Endpoint, with the <code>disallow_webview=true</code> query string, in an embedded webview instead of the authorization flows currently displayed. If you do not see an error message while testing the effect of the new embedded webview policies your app's implementation might not be impacted by this announcement. </p> <p> Note: A website's ability to request authorization from a Google Account may be impacted due to another developer's decision to use an embedded webview in their app. For example, if a messaging or news application opens links to your site in an embedded webview, the features available on your site, including Google OAuth 2.0 authorization flows, may be impacted. If your site or app is impacted by the implementation choice of another developer please contact that developer directly. </p> <h1 id="warning-message"><a href="#warning-message">User-facing warning message </a></h1> <p> A warning message may be displayed in non-compliant authorization requests after August 30, 2021. The warning message will include the user support email defined in your project's <a href="https://web.archive.org/web/20210720135936/https://console.developers.google.com/apis/credentials/consent">OAuth consent screen in Google API Console</a> and direct the user to visit our <a href="https://web.archive.org/web/20210720135936/https://support.google.com/accounts/answer/7675428">Sign in with a supported browser</a> support article. </p> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-4qdypG9Z6xU/YNOFfQqt9_I/AAAAAAAAKXQ/-Dh1LUVEGGUirv7q-E6kRi6iwoLBrcImQCLcBGAsYHQ/s0/Embedded%2BWebview%2BDeprecation%2B1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="A screenshot showing an example Google OAuth authorization dialog including a warning message: To help protect your account, Google will soon block apps that don't comply with Google's embedded webview policy. You can let the app developer (moo@gmail.com) know that this app should stop using embedded webviews" border="0" data-original-height="1600" data-original-width="727" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-4qdypG9Z6xU/YNOFfQqt9_I/AAAAAAAAKXQ/-Dh1LUVEGGUirv7q-E6kRi6iwoLBrcImQCLcBGAsYHQ/s0/Embedded%2BWebview%2BDeprecation%2B1.png" style="width:50%;border:1px solid black;"/></a></div> <p> Developers may acknowledge the upcoming enforcement and suppress the warning message by passing a specific query parameter to the authorization request URI. The following steps explain how to adjust your authorization requests to include the acknowledgement parameter: </p> <ol> <li>Go to where you send requests to Google's OAuth 2.0 Authorization Endpoint. Example URI: <code>https://accounts.google.com/o/oauth2/v2/auth</code> <li>Add an <code>ack_webview_shutdown</code> parameter with a value of the enforcement date: <code>2021-09-30</code>. Example: <code>ack_webview_shutdown=2021-09-30</code> </li> </ol> <p> A successful request to Google's OAuth 2.0 Authorization Endpoint including the acknowledgement query parameter and enforcement date will suppress the warning message in non-compliant authorization requests. All non-compliant authorization requests will display a <code>disallowed_useragent</code> error when loading Google's OAuth 2.0 Authorization Endpoint after the enforcement date. </p> <h1>Related content</h1> <ul> <li><a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html">Google Developers - Modernizing OAuth interactions in Native Apps for Better Usability and Security</a> <li><a href="https://web.archive.org/web/20210720135936/https://security.googleblog.com/2019/04/better-protection-against-man-in-middle.html">Google Security Blog - Better protection against Man in the Middle phishing attacks</a> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Upcoming security changes to Google's OAuth 2.0 authorization endpoint in embedded webviews&url=https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html" data-url="https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/06/upcoming-security-changes-to-googles-oauth-2.0-authorization-endpoint.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android" rel="tag"> android </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/featured" rel="tag"> featured </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ios" rel="tag"> ios </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oauth" rel="tag"> oauth </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/security" rel="tag"> security </a> </span> </div> </div> </div> <div class="post" data-id="7702356050232241598" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html" itemprop="url" title="With 1,600 students by his side, Jack Lee grew the largest Google Developer Student Club in the world"> With 1,600 students by his side, Jack Lee grew the largest Google Developer Student Club in the world </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Tuesday, June 29, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png "> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " style="display:none"> <p><em>Posted by Noa Havazelet, Program Manager, Google Developer Student Clubs, UK & Ireland </em><p> <p> With 1,600 students by his side, Jack Lee grew <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/london-school-of-economics-and-political-science/">the largest Google Developer Student Club</a> in the world in just 6 months at the London School of Economics (LSE). A life-long athlete, who loves leading teams, Jack saw that reigniting his university’s GDSC would be a great opportunity to have a large impact on the local tech scene. With a heavy focus on partnerships, Jack connected members of his club with leaders at top companies and other student groups across Scotland, France, Norway, Canada, and Nigeria. These collaborations enabled students to practice networking, while gaining access to key internships. </p> <p> Learn more about Jack and his club below. </p> <center> <a href=" https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " imageanchor="1" ><img alt="Image of Jack Lee" border="0" data-original-height="714" data-original-width="1058" id="imgFull" src=" https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " style="width:100%" /></a> <p id="imgCaption"> Image of Jack Lee speaking at a GDSC event </p> </center> <h2>Student-to-student mentorship with impact </h2> <p> Leaders like Jack Lee make Google Developer Student Clubs around the world special by providing a trusted and fun space for student-to-student mentorship. When students step up to help their peers, a strong camaraderie and support system forms beyond the classroom. </p> <p> One of the secrets to Jack’s success was to appeal to both computer science students as well as those with a non-technical background, like business majors. To inspire more students with different backgrounds to join the club, Jack put together a team of additional student leaders. Under his leadership, this team had the freedom to independently build tech-focused events that would interest students across the university. </p> <center> <a href=" https://1.bp.blogspot.com/-SBS9E4vcTME/YNse4sn7ABI/AAAAAAAAKYw/Ai2WN7XDt44PqaoqKDlIYgEd_1aV41vrACLcBGAsYHQ/s0/e6b629e5-a7f9-420a-9cb4-6574037a941d%2B2.jpeg" imageanchor="1" ><img border="0" data-original-height="714" data-original-width="1058" id="imgFull" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-SBS9E4vcTME/YNse4sn7ABI/AAAAAAAAKYw/Ai2WN7XDt44PqaoqKDlIYgEd_1aV41vrACLcBGAsYHQ/s0/e6b629e5-a7f9-420a-9cb4-6574037a941d%2B2.jpeg" /></a> </center> <p id="imgCaption"> Image of GDSC LSE team </p> <p> After the first semester, Jack’s approach was working. They hosted over 80 events, covering a wide range of topics including front end web development and career talks with financial firms. </p> <p> The intersection of students with different backgrounds inspired club members to work together on community projects, utilizing their different skills. In fact, a few club members formed teams to solve for one of the United Nations 17 Sustainable Development Goals. As part of the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/dsc-solution-challenge">Google Developer Student Clubs 2021 Solution Challenge</a>, students from the London School of Economics developed prototype solutions for NGOs on 1) wildfire analysis using TensorFlow, 2) raising donations and grant access, and 3) increasing voter registrations. </p> <p> As more students continued to join their GDSC, Jack decided to up the tempo to keep the momentum going. </p> <h2>Connecting students to companies</h2> <p> Since the London School of Economics is not only a tech-focused university, Jack requested support from a team at Google for Startups. Together they reached out to some of the world’s largest firms and startups to collaborate on events and specialized programs for the student club. Jack’s GDSC established relationships with 6 partners, and 3 local sponsors from startups, NGOs, and financial firms. All these partners contributed to nearly 30 events throughout the academic year, which included: </p> <ul> <li>Introductory Python courses <li>Mentorship sessions <li>Networking events <li>Talks with CEOs <li>Panel talks across industries </li> </ul> <p> These events started catching the attention of students across Europe and Asia, with some students who could not afford to attend university reaching out for technical learning resources and opportunities. <br> </p> <p> <strong><em>Connecting 150 students to mentors from different startups is one of the achievements that makes Jack and the club leaders most proud.</em></strong> </p> <p> This is yet another example of how Jack’s determination to grow a stronger community led him to build a global Google Developer Student Club that left a profound impact on his fellow students. </p> <p> If you’re also a student and want to join a Google Developer Student Club community like this, find one near you <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">here</a>. </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png "> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " style="display:none"> <p><em>Posted by Noa Havazelet, Program Manager, Google Developer Student Clubs, UK & Ireland </em><p> <p> With 1,600 students by his side, Jack Lee grew <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/london-school-of-economics-and-political-science/">the largest Google Developer Student Club</a> in the world in just 6 months at the London School of Economics (LSE). A life-long athlete, who loves leading teams, Jack saw that reigniting his university’s GDSC would be a great opportunity to have a large impact on the local tech scene. With a heavy focus on partnerships, Jack connected members of his club with leaders at top companies and other student groups across Scotland, France, Norway, Canada, and Nigeria. These collaborations enabled students to practice networking, while gaining access to key internships. </p> <p> Learn more about Jack and his club below. </p> <center> <a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " imageanchor="1"><img alt="Image of Jack Lee" border="0" data-original-height="714" data-original-width="1058" id="imgFull" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-SqYJJxKei8k/YNsgFBLh0ZI/AAAAAAAAKY4/OcGdFA1vK-MzpdfI4DwITsEMJ0Dzm1twACLcBGAsYHQ/s0/Screen%2BShot%2B2021-06-29%2Bat%2B9.28.37%2BAM.png " style="width:100%"/></a> <p id="imgCaption"> Image of Jack Lee speaking at a GDSC event </p> </center> <h2>Student-to-student mentorship with impact </h2> <p> Leaders like Jack Lee make Google Developer Student Clubs around the world special by providing a trusted and fun space for student-to-student mentorship. When students step up to help their peers, a strong camaraderie and support system forms beyond the classroom. </p> <p> One of the secrets to Jack’s success was to appeal to both computer science students as well as those with a non-technical background, like business majors. To inspire more students with different backgrounds to join the club, Jack put together a team of additional student leaders. Under his leadership, this team had the freedom to independently build tech-focused events that would interest students across the university. </p> <center> <a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-SBS9E4vcTME/YNse4sn7ABI/AAAAAAAAKYw/Ai2WN7XDt44PqaoqKDlIYgEd_1aV41vrACLcBGAsYHQ/s0/e6b629e5-a7f9-420a-9cb4-6574037a941d%2B2.jpeg" imageanchor="1"><img border="0" data-original-height="714" data-original-width="1058" id="imgFull" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-SBS9E4vcTME/YNse4sn7ABI/AAAAAAAAKYw/Ai2WN7XDt44PqaoqKDlIYgEd_1aV41vrACLcBGAsYHQ/s0/e6b629e5-a7f9-420a-9cb4-6574037a941d%2B2.jpeg"/></a> </center> <p id="imgCaption"> Image of GDSC LSE team </p> <p> After the first semester, Jack’s approach was working. They hosted over 80 events, covering a wide range of topics including front end web development and career talks with financial firms. </p> <p> The intersection of students with different backgrounds inspired club members to work together on community projects, utilizing their different skills. In fact, a few club members formed teams to solve for one of the United Nations 17 Sustainable Development Goals. As part of the <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/dsc-solution-challenge">Google Developer Student Clubs 2021 Solution Challenge</a>, students from the London School of Economics developed prototype solutions for NGOs on 1) wildfire analysis using TensorFlow, 2) raising donations and grant access, and 3) increasing voter registrations. </p> <p> As more students continued to join their GDSC, Jack decided to up the tempo to keep the momentum going. </p> <h2>Connecting students to companies</h2> <p> Since the London School of Economics is not only a tech-focused university, Jack requested support from a team at Google for Startups. Together they reached out to some of the world’s largest firms and startups to collaborate on events and specialized programs for the student club. Jack’s GDSC established relationships with 6 partners, and 3 local sponsors from startups, NGOs, and financial firms. All these partners contributed to nearly 30 events throughout the academic year, which included: </p> <ul> <li>Introductory Python courses <li>Mentorship sessions <li>Networking events <li>Talks with CEOs <li>Panel talks across industries </li> </ul> <p> These events started catching the attention of students across Europe and Asia, with some students who could not afford to attend university reaching out for technical learning resources and opportunities. <br> </p> <p> <strong><em>Connecting 150 students to mentors from different startups is one of the achievements that makes Jack and the club leaders most proud.</em></strong> </p> <p> This is yet another example of how Jack’s determination to grow a stronger community led him to build a global Google Developer Student Club that left a profound impact on his fellow students. </p> <p> If you’re also a student and want to join a Google Developer Student Club community like this, find one near you <a href="https://web.archive.org/web/20210720135936/https://dsc.community.dev/">here</a>. </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:With 1,600 students by his side, Jack Lee grew the largest Google Developer Student Club in the world&url=https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html" data-url="https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/06/with-1600-students-by-his-side-jack-lee.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Student%20Clubs" rel="tag"> Google Developer Student Clubs </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developers" rel="tag"> google developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20for%20startups" rel="tag"> google for startups </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20technology" rel="tag"> Google technology </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/startups" rel="tag"> startups </a> </span> </div> </div> </div> <div class="post" data-id="6437469246421207805" itemscope="" itemtype="http://schema.org/BlogPosting"> <h2 class="title" itemprop="name"> <a href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html" itemprop="url" title="Pride Week with Google Developer Groups from Floripa and Belo Horizonte, Brazil "> Pride Week with Google Developer Groups from Floripa and Belo Horizonte, Brazil </a> </h2> <div class="post-header"> <div class="published"> <span class="publishdate" itemprop="datePublished"> Monday, June 28, 2021 </span> </div> </div> <div class="post-body"> <div class="post-content" itemprop="articleBody"> <script type="text/template"> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg "> <img src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg " style="display:none"> <p><em>Posted by Rodrigo Akira Hirooka, Program Manager, Google Developer Groups Latin America </em><p> <p> Lorena Locks is on a mission to grow the LGBTQIA+ tech community in Brazil. Her inspiration came from hosting Google Developer Group (GDG) Floripa meetups with her friend Catarina, where they were able to identify a need in their community. </p> <center> <big> <b><p> “<em>We felt there wasn't a forum to meet people in the tech industry that reflected ourselves. So we decided to think bigger.”</em> </p></b> </big> </center> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-psNg6-D14pc/YNo_34tJ2GI/AAAAAAAAKYI/NFFmtbyU_KMWI45Lw9G_3wUFvrTTqHQbgCLcBGAsYHQ/s0/4th%2Bin%2Bjanuary%2B2020%2Bpride%2Bmeetup%252C%2Bthats%2Bme%2Bpresenting.jpeg" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from GDG Floripa event" border="0" data-original-height="1066" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-psNg6-D14pc/YNo_34tJ2GI/AAAAAAAAKYI/NFFmtbyU_KMWI45Lw9G_3wUFvrTTqHQbgCLcBGAsYHQ/s0/4th%2Bin%2Bjanuary%2B2020%2Bpride%2Bmeetup%252C%2Bthats%2Bme%2Bpresenting.jpeg" style="width:100%"/></a></div></center> <p id="imgCaption"> Image from GDG Floripa event </p> <h2>Pride Week at GDG Floripa and Belo Horizonte, Brazil </h2> <p> As a Women Techmakers Ambassador and Google Developer Group lead in Floripa, Brazil, Lorena worked with the local community to create a week of special events, including over 12 talks and sessions centered on empowering the LGBTQIA+ experience in tech. </p> <p> The events took place every night at 7pm from June 21st - 25th and focused on creating inclusive representation and building trust among developer communities. </p> <center> <big> <p> <strong><em>Lorena’s commitment to this underrepresented group gained the attention of many local leaders in tech who identify as LGBTQIA+ and volunteered as speakers during Pride Week.</em></strong> </p> </big> </center> <p> By creating spaces to talk about important LGBTQIA+ topics in tech, Pride Week events included sessions on: </p> <ul> <li>Spotting binary designs in products <li>How to build inclusive tech teams <li>Being an LGBTQIA+ manager <li>Developing '<a href="https://web.archive.org/web/20210720135936/https://nohssomos.com.br/">Nohs Somos</a>' an app for the LGBTQIA+ community <li>The best practices for D&I <li>General Personal Data Protection Law and inclusive gender questions on forms </li> </ul> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from event" border="0" data-original-height="900" data-original-width="1600" src="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg" style="width:100%"/></a></div></center> <p id="imgCaption"> Speakers in photo: Lorena Locks and Catarina Schein </p> <p> With one-hundred percent of the speakers at these events coming from the LGTBQIA+ community, Pride Week at GDG Floripa and Belo Horizonte was a high impact program that has gone on to inspire GDGs around the world. </p> <p> If you want to learn more about how to get involved in Google Developer Group communities like this one, visit the site <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/gdg">here</a>. </p> <span itemprop='author' itemscope='itemscope' itemtype='https://web.archive.org/web/20210720135936/http://schema.org/Person'> <meta content='https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <meta name="twitter:image" content="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg "> <img src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg " style="display:none"> <p><em>Posted by Rodrigo Akira Hirooka, Program Manager, Google Developer Groups Latin America </em><p> <p> Lorena Locks is on a mission to grow the LGBTQIA+ tech community in Brazil. Her inspiration came from hosting Google Developer Group (GDG) Floripa meetups with her friend Catarina, where they were able to identify a need in their community. </p> <center> <big> <b><p> “<em>We felt there wasn't a forum to meet people in the tech industry that reflected ourselves. So we decided to think bigger.”</em> </p></b> </big> </center> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-psNg6-D14pc/YNo_34tJ2GI/AAAAAAAAKYI/NFFmtbyU_KMWI45Lw9G_3wUFvrTTqHQbgCLcBGAsYHQ/s0/4th%2Bin%2Bjanuary%2B2020%2Bpride%2Bmeetup%252C%2Bthats%2Bme%2Bpresenting.jpeg" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from GDG Floripa event" border="0" data-original-height="1066" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-psNg6-D14pc/YNo_34tJ2GI/AAAAAAAAKYI/NFFmtbyU_KMWI45Lw9G_3wUFvrTTqHQbgCLcBGAsYHQ/s0/4th%2Bin%2Bjanuary%2B2020%2Bpride%2Bmeetup%252C%2Bthats%2Bme%2Bpresenting.jpeg" style="width:100%"/></a></div></center> <p id="imgCaption"> Image from GDG Floripa event </p> <h2>Pride Week at GDG Floripa and Belo Horizonte, Brazil </h2> <p> As a Women Techmakers Ambassador and Google Developer Group lead in Floripa, Brazil, Lorena worked with the local community to create a week of special events, including over 12 talks and sessions centered on empowering the LGBTQIA+ experience in tech. </p> <p> The events took place every night at 7pm from June 21st - 25th and focused on creating inclusive representation and building trust among developer communities. </p> <center> <big> <p> <strong><em>Lorena’s commitment to this underrepresented group gained the attention of many local leaders in tech who identify as LGBTQIA+ and volunteered as speakers during Pride Week.</em></strong> </p> </big> </center> <p> By creating spaces to talk about important LGBTQIA+ topics in tech, Pride Week events included sessions on: </p> <ul> <li>Spotting binary designs in products <li>How to build inclusive tech teams <li>Being an LGBTQIA+ manager <li>Developing '<a href="https://web.archive.org/web/20210720135936/https://nohssomos.com.br/">Nohs Somos</a>' an app for the LGBTQIA+ community <li>The best practices for D&I; <li>General Personal Data Protection Law and inclusive gender questions on forms </li> </ul> <center> <div class="separator" style="clear: both;"><a href="https://web.archive.org/web/20210720135936/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg" style="display: block; padding: 1em 0; text-align: center; "><img alt="Image from event" border="0" data-original-height="900" data-original-width="1600" src="https://web.archive.org/web/20210720135936im_/https://1.bp.blogspot.com/-GSFXyg2U3VA/YNpAk5W8hsI/AAAAAAAAKYQ/toE2vFE_1vkOsskcGjWT-bvPG8CVrnckgCLcBGAsYHQ/s0/impact%2Bfrom%2Bpride%2Bmeetup%2Buntil%2Bmarch%2B2020.jpeg" style="width:100%"/></a></div></center> <p id="imgCaption"> Speakers in photo: Lorena Locks and Catarina Schein </p> <p> With one-hundred percent of the speakers at these events coming from the LGTBQIA+ community, Pride Week at GDG Floripa and Belo Horizonte was a high impact program that has gone on to inspire GDGs around the world. </p> <p> If you want to learn more about how to get involved in Google Developer Group communities like this one, visit the site <a href="https://web.archive.org/web/20210720135936/https://developers.google.com/community/gdg">here</a>. </p> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> <meta content="https://web.archive.org/web/20210720135936/https://plus.google.com/116899029375914044550" itemprop="url"/> </span> </noscript> </div> </div> <div class="share"> <span class="twitter-custom social-wrapper" data-href="http://twitter.com/share?text=Google Developers Blog:Pride Week with Google Developer Groups from Floripa and Belo Horizonte, Brazil &url=https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html&via=google"> <img alt="Share on Twitter" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png" width="24"/> </span> <span class="fb-custom social-wrapper" data-href="https://www.facebook.com/sharer.php?u=https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html"> <img alt="Share on Facebook" height="24" src="https://web.archive.org/web/20210720135936im_/https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png" width="24"/> </span> </div> <div class="comment-container"> <i class="comment-img material-icons">  </i> <span class="cmt_count_iframe_holder" data-count="0" data-onclick="" data-post-url="https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html" data-url="https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html" style="color: #4184F3;"></span> </div> <div class="post-footer"> <div class="cmt_iframe_holder" data-href="https://developers.googleblog.com/2021/06/pride-week-with-google-developer-group.html" data-viewtype="FILTERED_POSTMOD"></div> <a href="https://web.archive.org/web/20210720135936/https://plus.google.com/112374322230920073195" rel="author" style="display:none;"> Google </a> <div class="label-footer"> <span class="labels-caption"> Labels: </span> <span class="labels"> <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developers" rel="tag"> developers </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Groups" rel="tag"> Google Developer Groups </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20technology" rel="tag"> Google technology </a> , <a class="label" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Pride%20Week" rel="tag"> Pride Week </a> </span> </div> </div> </div> <div class="blog-pager" id="blog-pager"> <a class="home-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/"> <i class="material-icons">  </i> </a> <i class="material-icons disabled">  </i> <span id="blog-pager-older-link"> <a class="blog-pager-older-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search?updated-max=2021-06-28T15:21:00-07:00&max-results=10" id="Blog1_blog-pager-older-link" title="Older Posts"> <i class="material-icons">  </i> </a> </span> </div> <div class="clear"></div> </div></div> </div> </div> <div class="col-right"> <div class="section" id="sidebar-top"><div class="widget HTML" data-version="1" id="HTML7"> <div class="widget-content"> <div class="searchBox"> <input type="text" title="Search This Blog" placeholder="Search blog ..."/> </div> </div> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("HTML7"));" rel="nofollow" target="configHTML7" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div></div> <div id="aside"> <div class="section" id="sidebar"><div class="widget Label" data-version="1" id="Label1"> <div class="tab"> <img class="sidebar-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII="/> <h2> Labels </h2> <i class="material-icons arrow">  </i> </div> <div class="widget-content list-label-widget-content"> <ul> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/.app"> .app </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/.dev"> .dev </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%2330DaysOfFlutter"> #30DaysOfFlutter </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23AIY"> #AIY </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23Contacts%20API"> #Contacts API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23CSEdWeek"> #CSEdWeek </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23devfest18%20%23devfeststories%20%23gdg%20%23googledevelopers%20%23developers%20%23community"> #devfest18 #devfeststories #gdg #googledevelopers #developers #community </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23freeandopen"> #freeandopen </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23GDC20"> #GDC20 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23Google%20Workspace"> #Google Workspace </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23Google%20Workspace%20Add-ons"> #Google Workspace Add-ons </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23Google%20Workspace%20Developer"> #Google Workspace Developer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23GoogleIO"> #GoogleIO </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23GooglePlay%20%23AndroidDevStory%20%23PlayStore%20%23DeveloperConsole%20%23StoreListingExperiments"> #GooglePlay #AndroidDevStory #PlayStore #DeveloperConsole #StoreListingExperiments </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23growwithgoogle"> #growwithgoogle </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io12"> #io12 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io13"> #io13 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io14"> #io14 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io15"> #io15 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io16"> #io16 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io17"> #io17 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io18"> #io18 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io2012"> #io2012 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io2013"> #io2013 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23io2014"> #io2014 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%23PeopleAPI"> #PeopleAPI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/%2B1"> +1 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/20%25%20project"> 20% project </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/3d"> 3d </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/3D%20face%20mesh"> 3D face mesh </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/about.com"> about.com </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/accelerator"> accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Access"> Access </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/accessibility"> accessibility </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Account%20Linking"> Account Linking </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/actions"> actions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Actions%20Builder"> Actions Builder </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Actions%20console"> Actions console </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/actions%20on%20google"> actions on google </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Actions%20SDK"> Actions SDK </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/actionsongoogle"> actionsongoogle </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/activity"> activity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Administrative%20APIs"> Administrative APIs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AdMob"> AdMob </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/adobe"> adobe </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Adobe%20Creative%20Cloud"> Adobe Creative Cloud </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Adobe%20Creative%20Cloud%20Libraries"> Adobe Creative Cloud Libraries </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Ads"> Ads </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/adsense"> adsense </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/advanced"> advanced </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/advogato"> advogato </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AdWords"> AdWords </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/africa"> africa </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/agency%20program"> agency program </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/agpl"> agpl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AI"> AI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AI%20Principles"> AI Principles </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AIY"> AIY </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AIY%20Projects"> AIY Projects </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AIYProjects"> AIYProjects </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ajax"> ajax </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ajax%20apis"> ajax apis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ajax%20search"> ajax search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ajax%20search%20books%20news%20apis"> ajax search books news apis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Alfred%20Camera"> Alfred Camera </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/all%20for%20good"> all for good </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/amarok"> amarok </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AMP"> AMP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AMP%20Cache"> AMP Cache </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/analytics"> analytics </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/and%20Assistant"> and Assistant </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android"> android </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20App%20Development"> Android App Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20Developer"> Android Developer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android%20developer%20certification"> android developer certification </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android%20developers"> android developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20Development"> Android Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20Studio"> Android Studio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20Things"> Android Things </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20Tools"> Android Tools </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Android%20TV"> Android TV </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android%20wear"> android wear </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/android11"> android11 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/androidstudio"> androidstudio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Angular"> Angular </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/animation"> animation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Announcement"> Announcement </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/announcements"> announcements </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/aogdevs"> aogdevs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apache"> apache </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/api"> api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/API.AI"> API.AI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apis"> apis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apis%20console"> apis console </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apis%20explorer"> apis explorer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apis.%20charts"> apis. charts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app"> app </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app%20design"> app design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/App%20dev"> App dev </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/App%20Development"> App Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app%20engine"> app engine </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app%20indexing"> app indexing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/app%20indexing%20api"> app indexing api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/App%20Invites"> App Invites </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AppActions"> AppActions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apple"> apple </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Application%20Development"> Application Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apps"> apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/apps%20script"> apps script </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AR"> AR </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ARCore"> ARCore </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/area%20120"> area 120 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Art"> Art </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/artifact%20management"> artifact management </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Artificial%20Intelligence"> Artificial Intelligence </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/asia"> asia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/asl"> asl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/assistant"> assistant </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/atom%20publishing%20protocol"> atom publishing protocol </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Audio"> Audio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/augmented%20faces"> augmented faces </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Augmented%20images"> Augmented images </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/augmented%20reality"> augmented reality </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/australia"> australia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Auth"> Auth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/authentication"> authentication </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/authsub"> authsub </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/automatic%20speech%20recognition"> automatic speech recognition </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/AutoML"> AutoML </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/awards"> awards </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/axsjax"> axsjax </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Badges"> Badges </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/barcodes"> barcodes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Bazel"> Bazel </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/beacon"> beacon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/beacons"> beacons </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Belarus"> Belarus </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/bespin"> bespin </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/best%20practices"> best practices </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/beta"> beta </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/bigquery"> bigquery </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/bitcoin"> bitcoin </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Black%20Consciousness%20Day"> Black Consciousness Day </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Blockly"> Blockly </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/blogger"> blogger </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Bluetooth"> Bluetooth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/book%20search"> book search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/books%20API"> books API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/bootcamp"> bootcamp </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/braintree"> braintree </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Brazil"> Brazil </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/british%20english"> british english </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Brotli"> Brotli </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/browser"> browser </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Build%20Out"> Build Out </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/building%20ajax%20apps"> building ajax apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/BuildOut"> BuildOut </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Bulgaria"> Bulgaria </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/business"> business </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/business%20console"> business console </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/buzz"> buzz </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/c%2B%2B"> c++ </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cache"> Cache </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/caja"> caja </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/caldav"> caldav </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/calendar"> calendar </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/camino"> camino </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/campfire%20one"> campfire one </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/caption"> caption </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cardboard"> cardboard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/CardDAV"> CardDAV </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cast"> cast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cast%20Connect"> Cast Connect </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/celebrating"> celebrating </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Certification"> Certification </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/certification%20award"> certification award </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Change"> Change </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/channel"> channel </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chinese"> chinese </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome"> chrome </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20apps"> chrome apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20dev%20summit"> chrome dev summit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20devtools"> chrome devtools </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20experiment"> chrome experiment </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20extensions"> chrome extensions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20os"> chrome os </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Chrome%20OS%20IO"> Chrome OS IO </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Chrome%20OS%20IO19"> Chrome OS IO19 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chrome%20web%20store"> chrome web store </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Chromebooks"> Chromebooks </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chromecast"> chromecast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chromium"> chromium </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/chronoscope"> chronoscope </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cifs"> cifs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/classes"> classes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/classroom%20api"> classroom api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/client%20libraries"> client libraries </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Climate"> Climate </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/closure%20tools"> closure tools </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud"> cloud </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20anchor"> Cloud anchor </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20Anchors"> Cloud Anchors </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20Computing"> Cloud Computing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20datastore"> cloud datastore </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20Functions"> Cloud Functions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20functions%20for%20firebase"> cloud functions for firebase </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20Next"> Cloud Next </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20platform"> cloud platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20portability"> cloud portability </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20services"> cloud services </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20sql"> cloud sql </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cloud%20storage"> cloud storage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Cloud%20Study%20Jam"> Cloud Study Jam </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cms"> cms </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/coca%20cola"> coca cola </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/CocoaPods"> CocoaPods </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/code%20for%20educators"> code for educators </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/code%20jam"> code jam </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/code%20review"> code review </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/code-in"> code-in </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/codeedu"> codeedu </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/codelabs"> codelabs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/coding"> coding </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/coffee%20with%20a%20googler"> coffee with a googler </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Colaboratory"> Colaboratory </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/collada"> collada </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/color"> color </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Colt%20McAnlis"> Colt McAnlis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/commerce"> commerce </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/community"> community </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/community%20connectors"> community connectors </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/compatibility"> compatibility </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/competition"> competition </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Compilers"> Compilers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/compression"> compression </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/compressorhead"> compressorhead </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/computer%20science"> computer science </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Computer%20Science%20Education%20Week"> Computer Science Education Week </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/computer%20vision"> computer vision </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/computing%20heritage"> computing heritage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/conference"> conference </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/conferences"> conferences </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Console"> Console </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/contacts%20api"> contacts api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Containers"> Containers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/contest"> contest </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/contextual%20gadgets"> contextual gadgets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/conversation%20design"> conversation design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/conversations"> conversations </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Coral"> Coral </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Coral%20updates"> Coral updates </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Core%20ML"> Core ML </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/couchdb"> couchdb </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/countdown%20to%20I%2FO%202012"> countdown to I/O 2012 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/country%20support"> country support </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/courses"> courses </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/COVID"> COVID </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/COVID-19"> COVID-19 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/COVID19DetectProtect"> COVID19DetectProtect </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/CPU"> CPU </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/crash%20course"> crash course </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Crash%20Reporting"> Crash Reporting </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/crashlytics"> crashlytics </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/creative%20commons"> creative commons </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cricket"> cricket </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/crisis%20response"> crisis response </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Croatia"> Croatia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Crostini"> Crostini </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cryptocurrency"> cryptocurrency </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cryptography"> cryptography </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/css"> css </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/css3"> css3 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Custom%20Elements"> Custom Elements </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/custom%20search"> custom search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/custom%20search%20api"> custom search api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/cxd"> cxd </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Czechia"> Czechia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/DA"> DA </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/danish%20linux%20forum"> danish linux forum </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dart"> dart </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Dashboard"> Dashboard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Data%20Compression"> Data Compression </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Data%20science"> Data science </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Data%20Visualization"> Data Visualization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/database"> database </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Databases"> Databases </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Dataset"> Dataset </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Datasets"> Datasets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/datastore"> datastore </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dataviz"> dataviz </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Daydream"> Daydream </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Debian"> Debian </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/demo"> demo </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/deprecation"> deprecation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Depth"> Depth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/design"> design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/desktop"> desktop </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/desktop%20apps"> desktop apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Dev%20Tools"> Dev Tools </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/devart"> devart </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/develop"> develop </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer"> developer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Advocate"> Developer Advocate </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Communities"> Developer Communities </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Culture"> Developer Culture </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Dashboard"> Developer Dashboard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer%20expert"> developer expert </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer%20features"> developer features </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Keynote"> Developer Keynote </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer%20library"> developer library </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Preview"> Developer Preview </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Developer%20Profile"> Developer Profile </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer%20relations"> developer relations </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developer%20student%20clubs"> developer student clubs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developers"> developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/developers.%20meetup"> developers. meetup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Development"> Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/devfest"> devfest </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/devfest%20developer%20chrome%20maps%20social%20wave%20apps"> devfest developer chrome maps social wave apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/DevFest18"> DevFest18 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/DevFestStories"> DevFestStories </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Device"> Device </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/DFP"> DFP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Dia%20da%20Consci%C3%AAncia%20Negra"> Dia da Consciência Negra </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dialogflow"> dialogflow </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/differential%20privacy"> differential privacy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Digital%20wallet"> Digital wallet </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/discovery%20service"> discovery service </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/diversity"> diversity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/diversity-and-inclusion"> diversity-and-inclusion </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/django"> django </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dns"> dns </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/do-it-yourself"> do-it-yourself </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Docker"> Docker </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/docs"> docs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/documentation"> documentation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/documents%20list%20api"> documents list api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dojo"> dojo </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/domain"> domain </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/domains"> domains </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/doodles"> doodles </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dot%20net"> dot net </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/doubleclick"> doubleclick </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dreamweaver"> dreamweaver </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Drive"> Drive </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/drupal"> drupal </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dsc"> dsc </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/dynamic%20links"> dynamic links </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/earn"> earn </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/earth"> earth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Ebay"> Ebay </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/eclipse"> eclipse </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/eclipsecon"> eclipsecon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/eddystone"> eddystone </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Edge%20AI"> Edge AI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Edge%20TPU"> Edge TPU </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Edge%20TPU%20Accelerator"> Edge TPU Accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Edge%20TPU%20Dev%20Board"> Edge TPU Dev Board </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/educatio"> educatio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/education"> education </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/email"> email </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/EMEA"> EMEA </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/encryption"> encryption </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/endpoints"> endpoints </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/enterprise"> enterprise </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Entity%20Extraction"> Entity Extraction </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/entrepreneurs"> entrepreneurs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Error%20logging"> Error logging </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Estimator"> Estimator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Estimators"> Estimators </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/estonia"> estonia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Ethics"> Ethics </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Europe"> Europe </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/event"> event </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/events"> events </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/evolution"> evolution </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/execution%20api"> execution api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/extensions"> extensions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Fabric"> Fabric </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/face%20detection"> face detection </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Fairness"> Fairness </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/fairness%20in%20machine%20learning"> fairness in machine learning </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/faster%20web"> faster web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/FCM"> FCM </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/FCP"> FCP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/featured"> featured </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/feeds"> feeds </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/finance"> finance </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/fintech"> fintech </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Firebase"> Firebase </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Firebase%20Analytics"> Firebase Analytics </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Firebase%20Cloud%20Functions"> Firebase Cloud Functions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Firebase%20Cloud%20Messaging"> Firebase Cloud Messaging </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Firebase%20Dynamic%20Links"> Firebase Dynamic Links </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/firebug"> firebug </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/firefox"> firefox </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/firestore"> firestore </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/firevox"> firevox </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/firstbeta"> firstbeta </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/fitness"> fitness </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/flutter"> flutter </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%201.2"> Flutter 1.2 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%201.5"> Flutter 1.5 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%201.9"> Flutter 1.9 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%202"> Flutter 2 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20at%20IO"> Flutter at IO </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Clock"> Flutter Clock </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Create"> Flutter Create </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20developers"> Flutter developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Engage"> Flutter Engage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20for%20desktop"> Flutter for desktop </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20for%20web"> Flutter for web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Interact"> Flutter Interact </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Live"> Flutter Live </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20plugin"> Flutter plugin </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/flutter%20release%20preview%201"> flutter release preview 1 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/flutter%20release%20preview%202"> flutter release preview 2 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Flutter%20Web"> Flutter Web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/foldables"> foldables </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Follow%20Us"> Follow Us </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Follow-up%20Responses"> Follow-up Responses </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/font%20api"> font api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Fonts"> Fonts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/fosdem"> fosdem </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/founders"> founders </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/freebsd"> freebsd </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/freenet"> freenet </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Fridaygram"> Fridaygram </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/fusion%20tables"> fusion tables </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/G%20Suite"> G Suite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/G%20Suite%20Developer"> G Suite Developer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/G%2B"> G+ </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gadgets"> gadgets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Game%20Developers%20Conference"> Game Developers Conference </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Game%20Development"> Game Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/games"> games </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gaming"> gaming </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gcc"> gcc </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gci"> gci </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GCP"> GCP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDA"> GDA </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdata"> gdata </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDC%202020"> GDC 2020 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDC17"> GDC17 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDD"> GDD </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdd07"> gdd07 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdd08"> gdd08 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdd09"> gdd09 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDD11"> GDD11 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GDE"> GDE </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdg"> gdg </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdl"> gdl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gdl%20weekly"> gdl weekly </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gears"> gears </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/General%20Availability"> General Availability </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/geo"> geo </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/geolocation"> geolocation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/geoserver"> geoserver </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GET"> GET </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/getpaid"> getpaid </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ghop"> ghop </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Gigster"> Gigster </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/git"> git </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/github"> github </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GKE"> GKE </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Glass"> Glass </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gmail"> gmail </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Gmail%20Add-on"> Gmail Add-on </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Gmail%20API"> Gmail API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Gmail%20APIs"> Gmail APIs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GMTC"> GMTC </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gnome"> gnome </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gnome%20women%27s%20summer%20outreach%20program"> gnome women's summer outreach program </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Go"> Go </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/golang"> golang </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/goo.gl"> goo.gl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google"> Google </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20AI"> Google AI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Analytics"> Google Analytics </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20APIs"> Google APIs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20apps"> google apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20apps%20api"> google apps api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20apps%20for%20your%20domain"> google apps for your domain </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20apps%20marketplace"> google apps marketplace </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20AR"> Google AR </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Arts%20%26%20Culture"> Google Arts & Culture </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20assistant"> google assistant </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Assistant%20Bluetooth"> Google Assistant Bluetooth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Assistant%20Developer%20Day"> Google Assistant Developer Day </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Assistant%20IO"> Google Assistant IO </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Assistant%20IO19"> Google Assistant IO19 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20assistant%20sdk"> google assistant sdk </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Brain"> Google Brain </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20buzz"> google buzz </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cardboard"> Google Cardboard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20cast"> google cast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20certification"> google certification </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20chart%20api"> google chart api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Charts"> Google Charts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20checkout"> google checkout </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20chrome"> google chrome </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud"> Google Cloud </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud%20Messaging"> Google Cloud Messaging </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud%20Platform"> Google Cloud Platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20cloud%20storage"> google cloud storage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud%20Talks"> Google Cloud Talks </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Cloud%20training"> Google Cloud training </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20code"> google code </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20code%20project%20hosting"> google code project hosting </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20code%20search"> google code search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20code%20university"> google code university </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20compute%20engine"> google compute engine </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Coral"> Google Coral </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20data%20apis"> google data apis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20data%20protocol"> google data protocol </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Data%20Studio"> Google Data Studio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developer%20day"> google developer day </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developer%20days"> google developer days </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Experts"> Google Developer Experts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Groups"> Google Developer Groups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Profiles"> Google Developer Profiles </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Scholarship"> Google Developer Scholarship </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developer%20Student%20Clubs"> Google Developer Student Clubs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developers"> google developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developers%20Academy"> Google Developers Academy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developers%20certification"> google developers certification </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20developers%20community%20groups"> google developers community groups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developers%20Groups"> Google Developers Groups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developers%20Live"> Google Developers Live </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developers%20site"> Google Developers site </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Developers%20University%20Consortium"> Google Developers University Consortium </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20docs"> google docs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Docs%20Add-on"> Google Docs Add-on </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Docs%20API"> Google Docs API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20doctype"> google doctype </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20domains"> google domains </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Drive"> Google Drive </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Drive%20SDK"> Google Drive SDK </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20earth"> google earth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20fit"> google fit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Fonts"> Google Fonts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20For%20Games"> Google For Games </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20for%20startups"> google for startups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20friend%20connect"> google friend connect </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20gadgets"> google gadgets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20gears"> google gears </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20grants"> google grants </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Groups%20Settings"> Google Groups Settings </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20health"> google health </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Home%20Hub"> Google Home Hub </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20I%2FO"> Google I/O </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Identity%20Platform"> Google Identity Platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20in%20Asia"> Google in Asia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20io"> google io </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20IOS%20Android"> Google IOS Android </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Maps"> Google Maps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Maps%20Platform"> Google Maps Platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20mashup%20editor"> google mashup editor </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Noto%20fonts"> Google Noto fonts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay"> google pay </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay%20account"> google pay account </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay%20api"> google pay api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay%20business"> google pay business </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Pay%20Developers"> Google Pay Developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Pay%20India"> Google Pay India </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay%20integration"> google pay integration </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20pay%20support"> google pay support </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20photos"> google photos </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20platform"> google platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Play"> Google Play </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Play%20Developer%20API"> Google Play Developer API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Play%20Developers"> Google Play Developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Play%20Indie%20games%20accelerator"> Google Play Indie games accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Play%20Indie%20Games%20Festival"> Google Play Indie Games Festival </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20play%20services"> google play services </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Registry"> Google Registry </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20scholarships"> google scholarships </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Science%20Fair"> Google Science Fair </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20sheets"> Google sheets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Sheets%20Add-on"> Google Sheets Add-on </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Sheets%20API"> Google Sheets API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Slides"> Google Slides </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Slides%20Add-on"> Google Slides Add-on </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Slides%20API"> Google Slides API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20space"> google space </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Spreadsheets%20API"> Google Spreadsheets API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20storage"> google storage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20summer%20of%20code"> google summer of code </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20tech%20talk"> Google tech talk </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20technology"> Google technology </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20technoloy%20user%20groups"> google technoloy user groups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20tv"> google tv </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20visualization%20api"> google visualization api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20wallet"> google wallet </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Wave"> Google Wave </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20web%20elements"> google web elements </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%20web%20toolkit"> google web toolkit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Workspace"> Google Workspace </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Workspace%20Add-ons"> Google Workspace Add-ons </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Workspace%20Chat"> Google Workspace Chat </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Workspace%20Chatbots"> Google Workspace Chatbots </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Google%20Workspace%20Developer"> Google Workspace Developer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google.org"> google.org </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/google%2B"> google+ </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GoogleAssistant"> GoogleAssistant </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/googlecast"> googlecast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/googledevelopers"> googledevelopers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/googleio"> googleio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/googlenew"> googlenew </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GooglePlay"> GooglePlay </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GooglePlay%20AndroidDev"> GooglePlay AndroidDev </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/googlewebelements%20googleio"> googlewebelements googleio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GPE"> GPE </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GPGS%20C%2B%2B%20Games"> GPGS C++ Games </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GPT"> GPT </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Gradle"> Gradle </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/green%20linux"> green linux </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Groovy"> Groovy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Groups%20API"> Groups API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/grow"> grow </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/grow%20with%20google"> grow with google </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gsoc"> gsoc </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GSuite"> GSuite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gtags"> gtags </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gtug"> gtug </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/guest%20post"> guest post </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/guice"> guice </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gulp"> gulp </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/GWSOP"> GWSOP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gwt"> gwt </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/gzip"> gzip </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hackathon"> hackathon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hacking"> hacking </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hackthon"> hackthon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hamilton"> hamilton </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hand%20tracking"> hand tracking </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Handwriting"> Handwriting </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hangouts"> hangouts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Hangouts%20Chat"> Hangouts Chat </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Hangouts%20Chat%20API"> Hangouts Chat API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/haproxy"> haproxy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Headset"> Headset </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hg"> hg </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hibernate"> hibernate </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/howto"> howto </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/hpux"> hpux </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/html"> html </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/html5"> html5 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/http"> http </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/I%2FO"> I/O </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/I%2FO%2017"> I/O 17 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/I%2FO%202017"> I/O 2017 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/I%2FO%20Extended"> I/O Extended </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/I%2FO%20Live"> I/O Live </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ical"> ical </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ICYMI"> ICYMI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/identity"> identity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ietf"> ietf </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ignite"> ignite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/igoogle"> igoogle </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/iguanas"> iguanas </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/iiw"> iiw </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Image%20Compression"> Image Compression </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/image%20search"> image search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Imara"> Imara </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/In-app%20billing"> In-app billing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/in-app%20payments"> in-app payments </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/in-app%20purchase"> in-app purchase </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/incubator"> incubator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/India"> India </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/indie"> indie </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/indie%20developers"> indie developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Indie%20Games"> Indie Games </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Indie%20Games%20Accelerator"> Indie Games Accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Indie%20Games%20Festival"> Indie Games Festival </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Information%20Technology%20Residency%20Program"> Information Technology Residency Program </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/information%20visualization"> information visualization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Instagram"> Instagram </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/integration%20status"> integration status </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/intelligentwire"> intelligentwire </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/interactive%20music"> interactive music </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/International%20Women%E2%80%99s%20Day"> International Women’s Day </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/internationalization"> internationalization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/internet%20explorer"> internet explorer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/internet%20of%20things"> internet of things </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/internship"> internship </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/interviews"> interviews </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IO"> IO </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IO17"> IO17 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/io18"> io18 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IO19"> IO19 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IO19%20Flutter"> IO19 Flutter </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IO2017"> IO2017 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ios"> ios </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/iOS%20SDK"> iOS SDK </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IoT"> IoT </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ipad"> ipad </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/iphone"> iphone </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/iPhone%20Development"> iPhone Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/israel"> israel </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Issue%20Tracker"> Issue Tracker </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ITRP"> ITRP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IWD%202020"> IWD 2020 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/IWD%202021"> IWD 2021 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/jaiku"> jaiku </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/japanese"> japanese </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/java"> java </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/javascript"> javascript </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/jetpack"> jetpack </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Jetpack%20Compose"> Jetpack Compose </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/joomla"> joomla </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/joomladayus2007"> joomladayus2007 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/joomladayusa"> joomladayusa </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/JS"> JS </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/json"> json </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/karaoke"> karaoke </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/KDE"> KDE </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/KDE%204.0"> KDE 4.0 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Keras"> Keras </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kernel"> kernel </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kernel%20summit"> kernel summit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/keynote"> keynote </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/khronos"> khronos </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kids"> kids </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kids%20coding"> kids coding </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kids%20coding%20team"> kids coding team </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/kml"> kml </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/korean"> korean </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Kotlin"> Kotlin </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Krakow"> Krakow </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Kubernetes"> Kubernetes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/labs"> labs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/lanchpad"> lanchpad </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/language"> language </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/languages"> languages </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/laptop%20apps"> laptop apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/laptops"> laptops </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Large%20Screens"> Large Screens </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/latam%20accelerator"> latam accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/LatAm%20startups"> LatAm startups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Latest"> Latest </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Latin%20America"> Latin America </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/latitude"> latitude </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/latvia"> latvia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/launch"> launch </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/launchpad"> launchpad </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/launchpad%20accelerator"> launchpad accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/launchpad%20studio"> launchpad studio </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/LaunchShow"> LaunchShow </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/lca"> lca </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Leadership"> Leadership </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Learning"> Learning </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/lens"> lens </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/lessons"> lessons </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/licenses"> licenses </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/linux"> linux </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/linux%20foundation"> linux foundation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Linux%20on%20Chrome%20OS"> Linux on Chrome OS </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Linux%20on%20Chromebooks"> Linux on Chromebooks </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/linux%20summit"> linux summit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/linux%20virtual%20server"> linux virtual server </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/linuxconf%20eu"> linuxconf eu </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/lithuania"> lithuania </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Local%20Home"> Local Home </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Local%20Home%20SDK"> Local Home SDK </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/localization"> localization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Location"> Location </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/LoCo"> LoCo </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Logging"> Logging </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/london"> london </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mac"> mac </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MacFuse"> MacFuse </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Machine"> Machine </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/machine%20intelligence"> machine intelligence </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/machine%20learning"> machine learning </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/machine%20learning%20accelerator"> machine learning accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mainframe%20Migration"> Mainframe Migration </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/maker"> maker </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Makers"> Makers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/malware"> malware </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/manufacturing"> manufacturing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/maps"> maps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/maps%20apis"> maps apis </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Marketplace"> Marketplace </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/material"> material </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/material%20components"> material components </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/material%20design"> material design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MDL"> MDL </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MediaPipe"> MediaPipe </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/meetup"> meetup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mercurial"> mercurial </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mexico%20startups"> Mexico startups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Micronaut"> Micronaut </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Microservices"> Microservices </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mirru"> Mirru </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MIT%20CSAIL"> MIT CSAIL </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MIT%20Media%20Lab"> MIT Media Lab </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ml"> ml </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ML%20Kit"> ML Kit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MLCC"> MLCC </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile"> mobile </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mobile%20App%20Development"> Mobile App Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile%20design"> mobile design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mobile%20Development"> Mobile Development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile%20performance"> mobile performance </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile%20sites"> mobile sites </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile%20speed"> mobile speed </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mobile%20UX"> mobile UX </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mobile%20web"> Mobile web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Mobile%20World%20Congress"> Mobile World Congress </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mod_pagespeed"> mod_pagespeed </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Moderator"> Moderator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/monetize"> monetize </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Monthly%20roundup"> Monthly roundup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MOOC"> MOOC </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mozilla"> mozilla </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/multi-platform"> multi-platform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mylar"> mylar </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/myspace"> myspace </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/MySQL"> MySQL </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/mythtv"> mythtv </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/named"> named </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/narratives"> narratives </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/native%20ads"> native ads </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/native%20client"> native client </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nearby"> nearby </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Nest"> Nest </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Nest%20WiFi"> Nest WiFi </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/netbsd"> netbsd </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Next%20Billion%20Users"> Next Billion Users </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nodejs"> nodejs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/non-profit"> non-profit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nonsense"> nonsense </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nosql"> nosql </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/notifications"> notifications </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Noto%20Serif%20CJK"> Noto Serif CJK </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/NPM"> NPM </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nss"> nss </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/nvidia"> nvidia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/NYT"> NYT </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/O3D"> O3D </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oauth"> oauth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/OAuth%20playground"> OAuth playground </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/OAuth2"> OAuth2 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Object%20Detection%20and%20Tracking"> Object Detection and Tracking </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/objective-c"> objective-c </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/OCaml"> OCaml </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Occlusion"> Occlusion </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ocr"> ocr </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ODF"> ODF </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/office%20hours"> office hours </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oha"> oha </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/online%20payments"> online payments </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/OOXML"> OOXML </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open%20data"> open data </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open%20source"> open source </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open%20source%20blog"> open source blog </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open%20source%20releases"> open source releases </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open%20web"> open web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/open-source"> open-source </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/openajax%20alliance"> openajax alliance </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/opengl"> opengl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/openid"> openid </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/opensocial"> opensocial </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/openssh"> openssh </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/openssl"> openssl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Optimization"> Optimization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oreilly"> oreilly </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/orkut"> orkut </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oscon"> oscon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oscon2007"> oscon2007 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/osi"> osi </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/oss%20devs"> oss devs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ossjam"> ossjam </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/osx"> osx </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/pactester"> pactester </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/page%20speed"> page speed </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/PageSpeed"> PageSpeed </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/palette"> palette </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/payment%20handler"> payment handler </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/payment%20request%20api"> payment request api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/payment%20web%20standard"> payment web standard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/payments"> payments </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/paypal"> paypal </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Peer%20bonus%20program"> Peer bonus program </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/performance"> performance </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/persistence"> persistence </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/persistent%20AR"> persistent AR </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/phone"> phone </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/photos"> photos </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/picasa"> picasa </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/picasa%20web"> picasa web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/places%20API"> places API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Platform_Update"> Platform_Update </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/play%20services"> play services </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/playground"> playground </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/plone"> plone </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/plone%20sprint"> plone sprint </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/podcast"> podcast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/poland"> poland </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Poly"> Poly </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/polymer"> polymer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Polymer%20Summit"> Polymer Summit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/portugal"> portugal </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Pose%20Detection"> Pose Detection </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Pose%20Estimation"> Pose Estimation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/posix"> posix </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/POST"> POST </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/PowerMeter%20API"> PowerMeter API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/prediction%20api"> prediction api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Prerender"> Prerender </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/preview"> preview </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Pride%20Week"> Pride Week </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/privacy"> privacy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/prizes"> prizes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/processing"> processing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/production%20access"> production access </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/products%20-%20slides"> products - slides </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/programmers"> programmers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/programming"> programming </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Progressive%20Web%20App"> Progressive Web App </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Project%20Connected%20Home%20over%20IP"> Project Connected Home over IP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/project%20hosting"> project hosting </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Project%20Loon"> Project Loon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Project%20Tango"> Project Tango </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/prototype"> prototype </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/proximity"> proximity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/pubsubhubbub"> pubsubhubbub </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/PWA"> PWA </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/py3k"> py3k </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/python"> python </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/python%20sprint"> python sprint </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Qualcomm"> Qualcomm </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Qualcomm%20Google"> Qualcomm Google </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/rails"> rails </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/random%20hacks%20of%20kindness"> random hacks of kindness </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Rasberry%20Pi"> Rasberry Pi </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Raw%20Depth"> Raw Depth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/React"> React </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/reader"> reader </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Recording%20and%20Playback"> Recording and Playback </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/releases"> releases </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Remote%20Config"> Remote Config </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/research"> research </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/reserve%20seats"> reserve seats </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Resources"> Resources </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Responsible%20AI"> Responsible AI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/REST"> REST </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/result%20snippets"> result snippets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Reto%20Meier"> Reto Meier </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/review%20process"> review process </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Rewarded%20Ads"> Rewarded Ads </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Rewarded%20Video%20Ads"> Rewarded Video Ads </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/rhino"> rhino </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Saatchi"> Saatchi </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Safety%20%26%20Security"> Safety & Security </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/safety%20and%20security"> safety and security </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/salesforce"> salesforce </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/samba"> samba </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sample%20dialogs"> Sample dialogs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sandbox"> sandbox </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Santa%20Tracker"> Santa Tracker </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Scala"> Scala </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/scalability"> scalability </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/scale-ups"> scale-ups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sceneform"> Sceneform </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/schedule"> schedule </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/scholarship"> scholarship </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/scholarships"> scholarships </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/scopes"> scopes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Scratch"> Scratch </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/screencast"> screencast </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sdk"> sdk </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sdks"> sdks </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/search"> search </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/security"> security </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Selfie%20Segmentation"> Selfie Segmentation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Serbia"> Serbia </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/serif"> serif </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Serverless"> Serverless </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/service%20worker"> service worker </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sessions"> sessions </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/seurat"> seurat </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/shape"> shape </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sheets"> Sheets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sheets%20API"> Sheets API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/shindig"> shindig </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/shopping"> shopping </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Shoreline%20Amphitheatre"> Shoreline Amphitheatre </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/shortcuts"> shortcuts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/showcase"> showcase </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sidewiki"> sidewiki </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sign%20language"> Sign language </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sign-in"> sign-in </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/signall"> signall </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/silverstripe"> silverstripe </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/SIMD"> SIMD </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sitemaps"> sitemaps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sites%20api"> sites api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sixapart"> sixapart </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sketchup"> sketchup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Slides%20API"> Slides API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/small%20business"> small business </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/small%20businesses"> small businesses </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/small-business"> small-business </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/smart%20display"> smart display </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Smart%20Home"> Smart Home </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Smart%20Lock%20for%20Passwords"> Smart Lock for Passwords </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/soap%20search%20api"> soap search api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/soc"> soc </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/social"> social </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/social%20graph"> social graph </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/software%20update"> software update </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/solaris"> solaris </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/solutions%20challenge"> solutions challenge </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/souders"> souders </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/spa2007"> spa2007 </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Space"> Space </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/spdy"> spdy </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/speakers"> speakers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/speech"> speech </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/speed"> speed </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/speed%20tracer"> speed tracer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Spring"> Spring </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/spyware"> spyware </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Stable%20release"> Stable release </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Stackdriver"> Stackdriver </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/standards"> standards </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/startup"> startup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Startup%20accelerator"> Startup accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/startup%20africa%20roadtrip"> startup africa roadtrip </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/startups"> startups </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Static%20Sites"> Static Sites </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/STEM"> STEM </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/storage"> storage </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/stories"> stories </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Street%20View"> Street View </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Strobe"> Strobe </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/student%20programs"> student programs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/students"> students </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/stuff"> stuff </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/style"> style </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/subscribed%20links"> subscribed links </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/subscription"> subscription </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/subversion"> subversion </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/summer%20of%20code"> summer of code </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Sundar%20Pichai"> Sundar Pichai </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/SVG"> SVG </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/sxsw"> sxsw </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/syndication"> syndication </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Tablets"> Tablets </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/targeted%20spyware"> targeted spyware </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tasks%20API"> tasks API </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Team%20Drives%20%28new%29"> Team Drives (new) </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/techmakers"> techmakers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Technical%20Writing"> Technical Writing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/technology"> technology </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/templates"> templates </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TensorFlow"> TensorFlow </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tensorflow%20dev%20summit"> tensorflow dev summit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TensorFlow%20Lite"> TensorFlow Lite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TensorFlow%20Research%20Cloud"> TensorFlow Research Cloud </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tensorRT"> tensorRT </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Test%20Lab"> Test Lab </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/testing"> testing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/text%20embedding%20models"> text embedding models </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Tez"> Tez </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TF%20Lite"> TF Lite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tfdevsummit"> tfdevsummit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TFLite"> TFLite </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/themes"> themes </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/thought%20leadership"> thought leadership </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tool"> tool </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Toolkit"> Toolkit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tools"> tools </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/topp"> topp </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TPU"> TPU </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/TPU%20Dev%20Board"> TPU Dev Board </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/training"> training </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Traits"> Traits </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tranparency"> tranparency </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/transit"> transit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/translate"> translate </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/translation"> translation </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tutorials"> tutorials </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/tv"> tv </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ubiquitous%20computing"> ubiquitous computing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ubiquity"> ubiquity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ubucon"> ubucon </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ubuntu"> ubuntu </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Udacity"> Udacity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/UI"> UI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Ukraine"> Ukraine </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/UN"> UN </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/UNDP"> UNDP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/UNICEF"> UNICEF </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/unicode"> unicode </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/unit%20test"> unit test </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Unity"> Unity </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/universal"> universal </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Universal%20App%20Campaigns"> Universal App Campaigns </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/University"> University </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/unix"> unix </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Update"> Update </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/updates"> updates </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/url"> url </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/url%20shortener"> url shortener </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/URLs"> URLs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/USB%20Accelerator"> USB Accelerator </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/UX"> UX </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/verification"> verification </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/video"> video </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/videos"> videos </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Vim"> Vim </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/virtual%20keyboard"> virtual keyboard </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/virtual%20reality"> virtual reality </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/visualization"> visualization </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/voice"> voice </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/voice%20kit"> voice kit </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/voice%20technology"> voice technology </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/voice%20user%20interface"> voice user interface </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/VR"> VR </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/VUI"> VUI </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/wattpad"> wattpad </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Wear%20OS"> Wear OS </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Wearables"> Wearables </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Weave"> Weave </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web"> web </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20animations%20api"> web animations api </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20apps"> web apps </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20components"> web components </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20design"> web design </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20designer"> web designer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20development"> web development </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20exponents"> web exponents </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20fonts"> web fonts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Web%20payments"> Web payments </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20performance"> web performance </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20platform%20docs"> web platform docs </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/web%20registry"> web registry </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/webfonts"> webfonts </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/webgl"> webgl </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/webmaster"> webmaster </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/WebP"> WebP </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/website%20optimizer"> website optimizer </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/websites"> websites </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/webVR"> webVR </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/weekly%20roundup"> weekly roundup </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/WhiteHouse.gov"> WhiteHouse.gov </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Who%27s%20at%20Google%20I%2FO"> Who's at Google I/O </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/win"> win </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/windows"> windows </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/windows%20programming"> windows programming </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Winter%20of%20Code"> Winter of Code </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/women"> women </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/women%20developers"> women developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Women%20in%20Tech"> Women in Tech </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Women%20Tech%20Makers"> Women Tech Makers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/women%20techmakers"> women techmakers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/WomenTechmakers"> WomenTechmakers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/writing"> writing </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/wtm"> wtm </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/xauth"> xauth </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/yahoo"> yahoo </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/young%20developers"> young developers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/Young%20Makers"> Young Makers </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/youtube"> youtube </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/zlib"> zlib </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/zurich"> zurich </a> </li> <li> <a dir="ltr" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search/label/ZXing"> ZXing </a> </li> </ul> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("Label1"));" rel="nofollow" target="configLabel1" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div> </div><div class="widget BlogArchive" data-version="1" id="BlogArchive1"> <div class="tab"> <i class="material-icons icon">  </i> <h2> Archive </h2> <i class="material-icons arrow">  </i> </div> <div class="widget-content"> <div id="ArchiveList"> <div id="BlogArchive1_ArchiveList"> <ul class="hierarchy"> <li class="archivedate expanded"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy toggle-open"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/"> 2021 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate expanded"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2021/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/"> 2020 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2020/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/"> 2019 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2019/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/"> 2018 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2018/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/"> 2017 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2017/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/"> 2016 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2016/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/"> 2015 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2015/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/"> 2014 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2014/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/"> 2013 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2013/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/"> 2012 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2012/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/"> 2011 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2011/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/"> 2010 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2010/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/"> 2009 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2009/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/"> 2008 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2008/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/"> 2007 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2007/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/"> 2006 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/02/"> Feb </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2006/01/"> Jan </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class="intervalToggle"> <span class="new-toggle" href="javascript:void(0)"> <i class="material-icons arrow">  </i> </span> <a class="toggle" href="javascript:void(0)" style="display: none"> <span class="zippy"> <i class="material-icons">  </i>   </span> </a> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/"> 2005 </a> </div> <div class="items"> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/12/"> Dec </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/11/"> Nov </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/10/"> Oct </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/09/"> Sep </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/08/"> Aug </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/07/"> Jul </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/06/"> Jun </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/05/"> May </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/04/"> Apr </a> </div> <div class="items"> </div> </li> </ul> <ul class="hierarchy"> <li class="archivedate collapsed"> <div class=""> <a class="post-count-link" href="https://web.archive.org/web/20210720135936/https://developers.googleblog.com/2005/03/"> Mar </a> </div> <div class="items"> </div> </li> </ul> </div> </li> </ul> </div> </div> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("BlogArchive1"));" rel="nofollow" target="configBlogArchive1" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div> </div><div class="widget HTML" data-version="1" id="HTML6"> <div class="widget-content"> <a href="https://web.archive.org/web/20210720135936/http://googledevelopers.blogspot.com/atom.xml"><img src="//web.archive.org/web/20210720135936im_/https://www.google.com/images/feed-icon.gif"></a> <a href="https://web.archive.org/web/20210720135936/http://googledevelopers.blogspot.com/atom.xml">Subscribe</a> </div> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("HTML6"));" rel="nofollow" target="configHTML6" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div></div> <div class="section" id="sidebar-bottom"><div class="widget HTML" data-version="1" id="HTML1"> <div class="widget-content"> <script src="https://web.archive.org/web/20210720135936js_/https://apis.google.com/js/plusone.js"></script> <div class="g-ytsubscribe" data-channelid="UC_x5XG1OV2P6uZZ5FSM9Ttw" data-layout="full"></div> <div class="share followgooglewrapper"> <button data-href="https://twitter.com/intent/follow?original_referer=http://googledevelopers.blogspot.in/&screen_name=googledevs" onclick="sharingPopup(this);" id="twitter-share"><span class="twitter-follow">Follow @googledevs</span></button> <script> function sharingPopup (button) { var url = button.getAttribute("data-href"); window.open( url,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); } </script> </div> </div> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("HTML1"));" rel="nofollow" target="configHTML1" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div><div class="widget HTML" data-version="1" id="HTML9"> <div class="widget-content"> Visit <a href="https://web.archive.org/web/20210720135936/http://developers.google.com/">Google Developers</a> for docs, event info, and more. </div> <div class="clear"></div> <span class="widget-item-control"> <span class="item-control blog-admin"> <a class="quickedit" onclick="return _WidgetManager._PopupConfig(document.getElementById("HTML9"));" rel="nofollow" target="configHTML9" title="Edit"> <img alt="" height="18" src="https://web.archive.org/web/20210720135936im_/https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18"/> </a> </span> </span> <div class="clear"></div> </div></div> </div> </div> <div style="clear:both;"></div> </div> <!-- Footer --> <div class="google-footer-outer loading"> <div id="google-footer"> <a href="//web.archive.org/web/20210720135936/https://www.google.com/"> <img class="google-logo-dark" height="36" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==" style="margin-top: -16px;" width="92"/> </a> <ul> <li> <a href="//web.archive.org/web/20210720135936/https://www.google.com/"> Google </a> </li> <li> <a href="//web.archive.org/web/20210720135936/https://www.google.com/policies/privacy/"> Privacy </a> </li> <li> <a href="//web.archive.org/web/20210720135936/https://www.google.com/policies/terms/"> Terms </a> </li> </ul> </div> </div> <script type="text/javascript"> //<![CDATA[ // Social sharing popups. var postEl = document.getElementsByClassName('social-wrapper'); var postCount = postEl.length; for(i=0; i<postCount;i++){ postEl[i].addEventListener("click", function(event){ var postUrl = this.getAttribute("data-href"); window.open( postUrl,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); });} //]]> </script> <script type="text/javascript"> //<![CDATA[ var BreakpointHandler = function() { this.initted = false; this.isHomePage = false; this.isMobile = false; }; BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) { // Use $.trim for IE8 compatibility summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,''); if (lastNode.nodeType == 3) { var lastChar = summaryHtml.slice(-1); if (!lastChar.match(/[.”"?]/)) { if (!lastChar.match(/[A-Za-z]/)) { summaryHtml = summaryHtml.slice(0, -1); } summaryHtml += ' ...'; } } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) { summaryHtml += ' ...'; } return summaryHtml; }; BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) { var seenWords = 0; var summaryHtml = ''; for (var i=0; i < content.childNodes.length; i++) { var node = content.childNodes[i]; var nodeText; if (node.nodeType == 1) { if (node.hasAttribute('data-about-pullquote')) { continue; } nodeText = node.textContent; if (nodeText === undefined) { // innerText for IE8 nodeText = node.innerText; } if (node.nodeName == 'DIV' || node.nodeName == 'B') { // Don't end early if we haven't seen enough words. if (seenWords < 10) { continue; } if (i > 0) { summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]); } break; } summaryHtml += node.outerHTML; } else if (node.nodeType == 3) { nodeText = node.nodeValue; summaryHtml += nodeText + ' '; } var words = nodeText.match(/\S+\s*/g); if (!words) { continue; } var remain = numWords - seenWords; if (words.length >= remain) { summaryHtml = this.finalizeSummary(summaryHtml, node); break; } seenWords += words.length; } return summaryHtml; }; BreakpointHandler.prototype.detect = function() { var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, query = window.location.search.substring(1); var urlParams = {}; while (match = search.exec(query)) urlParams[decode(match[1])] = decode(match[2]); this.isListPage = $('html').hasClass('list-page'); this.isMobile = urlParams['m'] === '1'; this.isHomePage = window.location.pathname == '/'; }; BreakpointHandler.prototype.initContent = function() { var self = this; $('.post').each(function(index) { var body = $(this).children('.post-body')[0]; var content = $(body).children('.post-content')[0]; $(content).addClass('post-original'); var data = $(content).children('script').html(); data = self.rewriteForSSL(data); // If exists, extract specified editor's preview. var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m); if (match) { data = match[1]; } // Prevent big images from loading when they aren't needed. // This must be done as a pre-injection step, since image loading can't be // canceled once embedded into the DOM. if (self.isListPage && self.isMobile) { data = data.replace(/<(img|iframe) .+?>/g, ''); } // Insert template to be rendered as nodes. content.innerHTML = data; if (self.isListPage) { var summary = document.createElement('div'); $(summary).addClass('post-content'); $(summary).addClass('post-summary'); body.insertBefore(summary, content); if (match) { // Use provided summary. summary.innerHTML = match[2]; } else { // Generate a summary. // Summary generation relies on DOM, so it must occur after content is // inserted into the page. summary.innerHTML = self.generateSummaryFromContent(content, 30); } // Add read more link to summary. var titleAnchor = $(this).find('.title a')[0]; var link = titleAnchor.cloneNode(true); link.innerHTML = 'Read More'; $(link).addClass('read-more'); summary.appendChild(link); } }); // Firefox does not allow for proper styling of BR. if (navigator.userAgent.indexOf('Firefox') > -1) { $('.post-content br').replaceWith('<span class="space"></span>'); } $('.loading').removeClass('loading'); }; BreakpointHandler.prototype.process = function() { if (!this.initted) { var makeInsecureImageRegex = function(hosts) { var whitelist = hosts.join('|').replace(/\./g,'\\.'); // Normal image tags, plus input images (yes, this is possible!) return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g'); }; this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS); this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]); this.detect(); this.initContent(); this.initted = true; } }; BreakpointHandler.KNOWN_HTTPS_HOSTS = [ "www.google.org", "www.google.com", "services.google.com", "blogger.com", "draft.blogger.com", "www.blogger.com", "photos1.blogger.com", "photos2.blogger.com", "photos3.blogger.com", "blogblog.com", "img1.blogblog.com", "img2.blogblog.com", "www.blogblog.com", "www1.blogblog.com", "www2.blogblog.com", "0.bp.blogspot.com", "1.bp.blogspot.com", "2.bp.blogspot.com", "3.bp.blogspot.com", "4.bp.blogspot.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "themes.googleusercontent.com", ]; BreakpointHandler.prototype.rewriteForSSL = function(html) { // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content. return html.replace(this.sslImageRegex, '$1https://$4') .replace(this.sslImageCurrentDomainRegex, '$1//$4') .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4') // Slideshow SWF takes a image host, so we need to rewrite that parameter. .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s'); }; $(document).ready(function() { var handler = new BreakpointHandler(); handler.process(); function DeviceMotionSender(){if(!this.isIOS_()){return}window.addEventListener("devicemotion",this.onDeviceMotion_.bind(this),false);this.iframes=document.querySelectorAll("iframe.vrview")}DeviceMotionSender.prototype.onDeviceMotion_=function(e){var message={type:"DeviceMotion",deviceMotionEvent:this.cloneDeviceMotionEvent_(e)};for(var i=0;i<this.iframes.length;i++){var iframe=this.iframes[i];var iframeWindow=iframe.contentWindow;if(this.isCrossDomainIframe_(iframe)){iframeWindow.postMessage(message,"*")}}};DeviceMotionSender.prototype.cloneDeviceMotionEvent_=function(e){return{acceleration:{x:e.acceleration.x,y:e.acceleration.y,z:e.acceleration.z},accelerationIncludingGravity:{x:e.accelerationIncludingGravity.x,y:e.accelerationIncludingGravity.y,z:e.accelerationIncludingGravity.z},rotationRate:{alpha:e.rotationRate.alpha,beta:e.rotationRate.beta,gamma:e.rotationRate.gamma},interval:e.interval}};DeviceMotionSender.prototype.isIOS_=function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream};DeviceMotionSender.prototype.isCrossDomainIframe_=function(iframe){var html=null;try{var doc=iframe.contentDocument||iframe.contentWindow.document;html=doc.body.innerHTML}catch(err){}return html===null};var dms=new DeviceMotionSender; // Top-level navigation. $(".BlogArchive .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); $(".Label .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); // Blog archive year expansion. $('.BlogArchive .intervalToggle').click(function(ev) { ev.preventDefault(); if ($(this).parent().hasClass('collapsed')) { $(this).parent().removeClass('collapsed'); $(this).parent().addClass('expanded'); } else { $(this).parent().removeClass('expanded'); $(this).parent().addClass('collapsed'); } }); // Reverse order of months. $('.BlogArchive .intervalToggle + div').each(function(_, items) { var year = $(this); year.children().each(function(_, month) { year.prepend(month); }); }); // Set anchors to open in new tab. $('.post-content img').parent().each(function(_, node) { if (node.nodeName == 'A') { $(this).attr('target', '_blank'); } }); // Process search requests. $('.searchBox input').on("keypress", function(ev) { if (ev.which == 13) { window.location.href = 'https://web.archive.org/web/20210720135936/https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val()); } }); }); //]]> </script> <script type="text/javascript" src="https://web.archive.org/web/20210720135936js_/https://www.blogger.com/static/v1/widgets/4182860900-widgets.js"></script> <script type="text/javascript"> window['__wavt'] = 'AOuZoY73Z9lc_jNHHkqlpDVn_4opJEyPeQ:1626789575367';_WidgetManager._Init('//web.archive.org/web/20210720135936/https://www.blogger.com/rearrange?blogID\x3d596098824972435195','//web.archive.org/web/20210720135936/https://developers.googleblog.com/','596098824972435195'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '596098824972435195', 'title': 'Google Developers Blog', 'url': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/', 'canonicalUrl': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/', 'homepageUrl': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/', 'searchUrl': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/search', 'canonicalHomepageUrl': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/', 'blogspotFaviconUrl': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/favicon.ico', 'bloggerUrl': 'https://web.archive.org/web/20210720135936/https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-19996418-48', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Developers Blog - Atom\x22 href\x3d\x22https://developers.googleblog.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Google Developers Blog - RSS\x22 href\x3d\x22https://developers.googleblog.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Developers Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/596098824972435195/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'ieCssRetrofitLinks': '\x3c!--[if IE]\x3e\x3cscript type\x3d\x22text/javascript\x22 src\x3d\x22https://www.blogger.com/static/v1/jsbin/3775400722-ieretrofit.js\x22\x3e\x3c/script\x3e\n\x3c![endif]--\x3e', 'view': '', 'dynamicViewsCommentsSrc': '//web.archive.org/web/20210720135936/https://www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//web.archive.org/web/20210720135936/https://www.blogblog.com/dynamicviews/638407af81660234', 'plusOneApiSrc': 'https://web.archive.org/web/20210720135936/https://apis.google.com/js/plusone.js', 'disableGComments': true, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'Twitter', 'key': 'twitter', 'shareMessage': 'Share to Twitter', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 300, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'index', 'pageName': '', 'pageTitle': 'Google Developers Blog', 'metaDescription': 'News and insights on Google platforms, tools, and events.'}}, {'name': 'features', 'data': {'sharing_get_link_dialog': 'true', 'sharing_native': 'false'}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Google Developers Blog', 'description': 'News and insights on Google platforms, tools, and events.', 'url': 'https://web.archive.org/web/20210720135936/https://developers.googleblog.com/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': true, 'isArchive': false, 'isLabelSearch': false}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML7', 'sidebar-top', document.getElementById('HTML7'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML6', 'sidebar', document.getElementById('HTML6'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar-bottom', document.getElementById('HTML1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML9', 'sidebar-bottom', document.getElementById('HTML9'), {}, 'displayModeFull')); </script> </body> </html><!-- FILE ARCHIVED ON 13:59:36 Jul 20, 2021 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 13:04:09 Feb 21, 2025. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.602 exclusion.robots: 0.03 exclusion.robots.policy: 0.017 esindex: 0.011 cdx.remote: 8.379 LoadShardBlock: 903.559 (3) PetaboxLoader3.datanode: 382.389 (4) PetaboxLoader3.resolve: 447.736 (2) load_resource: 98.825 -->