CINXE.COM
The Airbnb Tech Blog - Medium
<!DOCTYPE html><html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain"><title>The Airbnb Tech Blog - Medium</title><link rel="canonical" href="https://medium.com/airbnb-engineering"><link id="feedLink" rel="alternate" type="application/rss+xml" title="RSS" href="https://medium.com/feed/airbnb-engineering"><meta name="robots" content="index,follow"><meta name="title" content="The Airbnb Tech Blog - Medium"><meta name="referrer" content="unsafe-url"><meta name="description" content="Creative engineers and data scientists building a world where you can belong anywhere. http://airbnb.io."><meta name="keywords" content="DATA SCIENCE, WEB DEVELOPMENT, OPEN SOURCE, FRONT END DEVELOPMENT, ARTIFICIAL INTELLIGENCE"><meta name="theme-color" content="#000000"><meta property="og:title" content="The Airbnb Tech Blog – Medium"><meta property="twitter:title" content="The Airbnb Tech Blog – Medium"><meta property="og:url" content="https://medium.com/airbnb-engineering"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="Creative engineers and data scientists building a world where you can belong anywhere. http://airbnb.io."><meta name="twitter:description" content="Creative engineers and data scientists building a world where you can belong anywhere. http://airbnb.io."><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><meta property="og:type" content="medium-com:collection"><meta name="twitter:card" content="summary_large_image"><meta property="medium-com:creator" content="https://medium.com/@airbnbeng"><meta name="twitter:site" content="@Medium"><meta property="og:site_name" content="Medium"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://airbnb-engineering"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://airbnb-engineering"><meta property="al:android:url" content="medium://airbnb-engineering"><meta property="al:web:url" content="https://medium.com/airbnb-engineering"><link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" /><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/airbnb-engineering" /><script type="application/ld+json">{"@context": "http://schema.org", "@graph": [{"@type": "WebSite", "url": "https:\/\/medium.com", "name": "Medium", "alternateName": "Medium is a community of readers and writers offering unique perspectives on ideas large and small."},{"@type": "Organization", "url": "https:\/\/medium.com\/airbnb-engineering", "name": "The Airbnb Tech Blog"}]}</script><link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-branding-base.W9J-2zkF03j8TkriAGn1Tg.12.css"><script>!function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);</script><script>document.domain = document.domain;</script><script>if (window.top !== window.self) window.location = 'about:blank';var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga("create", "G-7JY7T788PK", "auto", {"allowLinker": true, "legacyCookieDomain": window.location.hostname});ga("send", "pageview");</script><script async src="https://www.google-analytics.com/analytics.js"></script><script>(function () {var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; document.write("<style>section.section-image--fullBleed.is-backgrounded {padding-top: " + Math.round(1.1 * height) + "px;}section.section-image--fullScreen.is-backgrounded, section.section-image--coverFade.is-backgrounded {min-height: " + height + "px; padding-top: " + Math.round(0.5 * height) + "px;}.u-height100vh {height: " + height + "px !important;}.u-height110vh {height: " + Math.round(1.1 * height) + "px !important;}.u-minHeight100vh {min-height: " + height + "px !important;}.u-maxHeight100vh {max-height: " + height + "px !important;}section.section-image--coverFade {height: " + height + "px;}.section-aspectRatioViewportPlaceholder, .section-aspectRatioViewportCropPlaceholder {max-height: " + height + "px;}.section-aspectRatioViewportBottomSpacer, .section-aspectRatioViewportBottomPlaceholder {max-height: " + Math.round(0.5 * height) + "px;}.zoomable:before {top: " + (-1 * height) + "px; left: " + (-1 * width) + "px; padding: " + height + "px " + width + "px;}</style>");})()</script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js"></script><![endif]--><link rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19" class="js-favicon"><link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*MlNQKg-sieBGW5prWoe9HQ.jpeg"><link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg" color="#171717"></head><body itemscope class=" browser-ie os-windows v-unbound v-glyph v-glyph--m2-unbound-source-serif-pro is-noJs"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main" id="container"><div class="butterBar butterBar--error"></div><div class="surface"><div id="prerendered" class="screenContent"><div class="metabar u-clearfix js-metabar"><div class="branch-journeys-top"></div><div class="js-metabarMiddle metabar-inner u-marginAuto u-maxWidth1032 u-flexCenter u-justifyContentSpaceBetween u-height65 u-xs-height56 u-paddingHorizontal20"><div class="metabar-block u-flex1 u-flexCenter"><div class="js-metabarLogoLeft"><a href="https://medium.com/" data-log-event="home" class="siteNav-logo u-fillBlack u-flex0 u-flexCenter u-paddingTop0"><span class="svgIcon svgIcon--wordmarkMedium svgIcon--120x26px u-flex"><svg class="svgIcon-use" width="120" height="26" ><path d="M29.57 1.404l.036-.008V1.12h-7.27l-6.75 15.979-6.75-15.98H1.003v.278l.035.008c1.327.302 2 .752 2 2.374v18.993c0 1.623-.676 2.073-2.003 2.374L1 25.153v.279h5.315v-.278l-.035-.008c-1.327-.302-2-.751-2-2.374V4.88l8.67 20.552h.492l8.924-21.125V23.24c-.114 1.282-.782 1.677-1.983 1.95l-.036.009v.275h9.259V25.2l-.036-.008c-1.203-.274-1.886-.67-2-1.95l-.006-19.464h.006c0-1.622.674-2.072 2-2.374zm4.23 12.582c.15-3.412 1.367-5.875 3.41-5.918.629.01 1.157.219 1.568.62.872.852 1.282 2.634 1.219 5.298h-6.198zm-.092.962h10.85v-.046c-.03-2.61-.78-4.64-2.228-6.033-1.25-1.204-3.103-1.867-5.048-1.867h-.043c-1.01 0-2.248.246-3.13.693a7.316 7.316 0 00-2.623 2.086c-1.185 1.479-1.903 3.477-2.078 5.724a13.717 13.717 0 00-.04.755c-.004.195-.005.39-.001.587.117 5.087 2.846 9.153 7.692 9.153 4.254 0 6.73-3.132 7.348-7.336l-.312-.11c-1.085 2.259-3.034 3.628-5.252 3.461-3.028-.228-5.347-3.32-5.137-7.066m23.122 6.893c-.356.85-1.099 1.319-2.094 1.319-.995 0-1.905-.689-2.552-1.939-.694-1.342-1.06-3.24-1.06-5.487 0-4.678 1.445-7.704 3.68-7.704.937 0 1.674.468 2.026 1.284v12.527zm7.198 3.335c-1.327-.316-2-.787-2-2.492V0l-8.062 2.392v.293l.05-.004c1.111-.09 1.866.064 2.304.472.343.32.51.809.51 1.498v3.11C56.033 7.25 55.088 7 53.94 7c-2.326 0-4.453.987-5.986 2.779-1.599 1.867-2.444 4.42-2.444 7.38 0 5.287 2.584 8.84 6.43 8.84 2.25 0 4.06-1.242 4.888-3.336v2.811h7.233v-.29l-.035-.008zM70.94 3.085c0-1.65-1.236-2.896-2.875-2.896-1.632 0-2.908 1.272-2.908 2.896 0 1.624 1.278 2.896 2.908 2.896 1.64 0 2.875-1.245 2.875-2.896zm1.903 22.092c-1.327-.316-2-.787-2-2.492h-.006V7.055l-7.234 2.092v.284l.043.004c1.566.14 1.994.683 1.994 2.525v13.515h7.24v-.29l-.037-.008zm18.536 0c-1.327-.316-2-.787-2-2.492V7.055L82.49 9.078v.285l.04.004c1.28.136 1.65.71 1.65 2.56v9.88c-.426.85-1.227 1.356-2.196 1.39-1.573 0-2.439-1.07-2.439-3.012V7.055l-7.234 2.092v.284l.044.004c1.565.14 1.994.683 1.994 2.525v8.362a9.443 9.443 0 00.15 1.741l.13.57C75.243 24.845 76.848 26 79.362 26c2.129 0 3.996-1.328 4.818-3.405v2.885h7.233v-.291l-.034-.012zm28.102.298v-.291l-.035-.009c-1.44-.334-2.001-.964-2.001-2.248V12.295C117.445 8.98 115.597 7 112.5 7c-2.257 0-4.16 1.314-4.893 3.36-.582-2.168-2.257-3.36-4.734-3.36-2.175 0-3.88 1.156-4.612 3.11V7.056l-7.233 2.006v.286l.043.004c1.547.138 1.994.697 1.994 2.492v13.631h6.75v-.29l-.037-.01c-1.148-.271-1.519-.767-1.519-2.04V10.95c.304-.715.917-1.562 2.127-1.562 1.504 0 2.266 1.05 2.266 3.116v12.972h6.751v-.29l-.035-.01c-1.149-.271-1.52-.767-1.52-2.04V12.294a7.107 7.107 0 00-.095-1.21c.322-.777.97-1.696 2.23-1.696 1.524 0 2.265 1.02 2.265 3.116v12.972h7.233z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div><div class="u-paddingLeft10 u-sm-show r-paddingRight10"><a href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com/airbnb-engineering%3F~feature=LoMobileNavBar&~channel=ShowCollectionHome&~stage=m2">Open in app</a></div></div><div class="metabar-block u-flex0 u-flexCenter"><div class="u-flexCenter u-height65 u-xs-height56"><div class="buttonSet buttonSet--wide u-lineHeightInherit"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-xs-hide js-signInButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2Fairbnb-engineering%3Fsource%3Duser_profile_page---------7-------------9f3427a69792---------------&source=--------------------------nav_reg&operation=login" data-action="sign-in-prompt" data-redirect="https://medium.com/airbnb-engineering?source=user_profile_page---------7-------------9f3427a69792---------------" data-action-source="--------------------------nav_reg">Sign in</a><a class="button button--primary button--withChrome u-accentColor--buttonNormal is-inSiteNavBar js-signUpButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2Fairbnb-engineering%3Fsource%3Duser_profile_page---------7-------------9f3427a69792---------------&source=--------------------------nav_reg&operation=register" data-action="sign-up-prompt" data-redirect="https://medium.com/airbnb-engineering?source=user_profile_page---------7-------------9f3427a69792---------------" data-action-source="--------------------------nav_reg">Get started</a></div></div></div></div></div><div class="metabar metabar--spacer js-metabarSpacer u-height65 u-xs-height56"></div><div class="collectionHeader js-collectionHeaderContainer u-relative collectionHeader--layoutMedium collectionHeader--alignmentLeft collectionHeader--withLogo collectionHeader--withBackground collectionHeader--colorBehaviorSubtle collectionHeader--withNavigation collectionHeader--editorLayoutTitleAndLogo is-modeView"><div class="collectionHeader-aspectRatioTable"><div class="collectionHeader-aspectRatioContent u-backgroundSizeCover js-collectionHeaderBackground" style="background-image: url("https://cdn-images-1.medium.com/max/2400/1*eM5hEN1XX7U9XDPgjcFC8g.png"); background-position: 50% 50% !important;"><div class="collectionHeader-overlayBackground u-height100vh"></div><header class="collectionHeader-heroAndInlineNav u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto u-foreground js-collectionHeader"><div class="collectionHeader-hero js-collectionHeaderHero u-clearfix u-imageSpectrum"><div class="collectionHeader-heroInner"><div class="collectionHeader-logo js-collectionHeaderLogo" style="width: 89px; float: left; padding-right: 20px; margin-right: 0;"><a class="link u-baseColor--link" href="https://medium.com/airbnb-engineering" title="Go to The Airbnb Tech Blog" aria-label="Go to The Airbnb Tech Blog"><div class="u-relative u-marginAuto"><div style="padding-bottom: 103.18021201413427%"></div><img class="collectionHeader-logoImage js-collectionHeaderLogoImage" src="https://cdn-images-1.medium.com/max/178/1*5wg57UPTn3EZIWQSgf9mMA@2x.png" data-image-id="1*5wg57UPTn3EZIWQSgf9mMA@2x.png" data-width="566" data-height="584" /></div></a></div><div class="collectionHeader-nameAndDescription"><a class="link link--noUnderline u-baseColor--link" href="https://medium.com/airbnb-engineering" title="Go to The Airbnb Tech Blog" aria-label="Go to The Airbnb Tech Blog"><h1 class="collectionHeader-name js-collectionName u-foreground u-baseColor--textDark u-paddingBottom4 u-lineHeightTightest u-contentSansBold u-fontSize40 u-xs-fontSize32">The Airbnb Tech Blog</h1></a><h2 class="collectionHeader-description js-collectionDescription u-foreground u-baseColor--textNormal u-contentSansRegular u-fontSize24 u-xs-fontSize18">A deeper look into how our Engineers and Data Scientists build a world of belonging</h2></div></div></div></header></div><div class="collectionHeader-aspectRatioCell"><div class="collectionHeader-aspectRatioFullWidth"></div></div></div><div class="collectionHeader-blockNav"><div class="u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto"><nav class="collectionHeader-nav u-clearfix js-collectionHeaderNav u-lineHeight40 u-overflowHiddenY"><div class="buttonSet u-flex1 u-noWrap u-overflowX u-paddingBottom100 u-xs-marginRight15"><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/data/home">Data</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/ai/home">AI & ML</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/tagged/mobile">Mobile</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/web/home">Web</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/airbnb-engineering-infrastructure/home">Infrastructure</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/open-source/home">Open Source</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/airbnb-engineering/medium-com-airbnb-engineering-people/home">People</a></li><span class="u-borderLeft1 u-paddingLeft22 u-xs-paddingLeft12 u-baseColor--borderLight"></span><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 is-external"><a class="link link--darkenOnHover u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://careers.airbnb.com/" rel="nofollow noopener" target="_blank">Careers</a></li></div><div class="buttonSet u-textAlignRight u-marginLeft18 u-flex0 u-noWrap"><label class="button button--small button--chromeless button--withIcon button--withSvgIcon inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--buttonNormal u-baseColor--placeholderNormal" title="Search"><span class="svgIcon svgIcon--search svgIcon--25px u-baseColor--iconLight"><svg class="svgIcon-use" width="25" height="25" ><path d="M20.067 18.933l-4.157-4.157a6 6 0 10-.884.884l4.157 4.157a.624.624 0 10.884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"/></svg></span><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search" required="true" data-collection-id="53c7c27702d5" /></label><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="https://twitter.com/AirbnbEng" title="Visit “The Airbnb Tech Blog” on X" aria-label="Visit “The Airbnb Tech Blog” on X" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--twitter svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" fill="none" ><path d="M14.215 11.3l5.764-6.7h-1.366l-5.005 5.818L9.611 4.6H5l6.045 8.798L5 20.424h1.366l5.286-6.144 4.221 6.144h4.61L14.216 11.3zm-1.871 2.175l-.612-.876-4.874-6.97h2.098l3.933 5.625.613.876 5.112 7.312h-2.098l-4.172-5.966z" fill="#242424"/></svg></span></span></a><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="//facebook.com/AirbnbTech" title="Visit “The Airbnb Tech Blog” on Facebook" aria-label="Visit “The Airbnb Tech Blog” on Facebook" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--facebookFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" ><path d="M21 12.646C21 7.65 16.97 3.6 12 3.6s-9 4.05-9 9.046a9.026 9.026 0 007.59 8.924v-6.376H8.395V12.64h2.193v-1.88c0-2.186 1.328-3.375 3.267-3.375.93 0 1.728.07 1.96.1V9.77H14.47c-1.055 0-1.26.503-1.26 1.242v1.63h2.517l-.33 2.554H13.21V21.6c4.398-.597 7.79-4.373 7.79-8.954"/></svg></span></span></a><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal js-relationshipButton is-smallPill" data-action="sign-up-prompt" data-sign-in-action="toggle-follow-collection" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/collection/airbnb-engineering" data-action-source="pub_header----53c7c27702d5----------------------follow_pub" data-collection-id="53c7c27702d5"><span class="button-label js-buttonLabel">Follow</span></button></div></nav></div></div></div><div class="u-marginBottom40 js-collectionStream"><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight15 u-size8of12" data-source="collection_home---4------0-----------------------" data-post-id="b236078ec82b" data-index="0"><div class="u-lineHeightBase postItem u-marginRight3"><a href="https://medium.com/airbnb-engineering/building-a-user-signals-platform-at-airbnb-b236078ec82b?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/building-a-user-signals-platform-at-airbnb-b236078ec82b?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height350 u-width100pct u-floatLeft u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/2000/0*ZDusO7LglpaC7sF7"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Building a User Signals Platform at Airbnb</span></a></div></div><div class="col u-xs-marginBottom10 u-paddingLeft9 u-paddingRight12 u-paddingTop0 u-sm-paddingTop20 u-paddingBottom25 u-size4of12 u-xs-size12of12 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/building-a-user-signals-platform-at-airbnb-b236078ec82b?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="b236078ec82b"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp4 u-fontSize30 u-size12of12 u-xs-size12of12 u-xs-fontSize24">Building a User Signals Platform at Airbnb</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">How Airbnb built a stream processing platform to power user personalization.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@kidaikwon36" data-action="show-user-card" data-action-value="ffe99664019a" data-action-type="hover" data-user-id="ffe99664019a" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*dmbNkD5D-u45r44go_cf0g.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kidai Kwon"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@kidaikwon36" data-action="show-user-card" data-action-value="ffe99664019a" data-action-type="hover" data-user-id="ffe99664019a" dir="auto">Kidai Kwon</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-20T19:27:27.368Z">Nov 20</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="9 min read"></span></div></div></div></div></div></div><div class="row u-marginTop15 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="e470535f76d4" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/airbnbs-ai-powered-photo-tour-using-vision-transformer-e470535f76d4?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/airbnbs-ai-powered-photo-tour-using-vision-transformer-e470535f76d4?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/0*QSGRcScNdh7js2oG"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Airbnb’s AI-powered photo tour using Vision Transformer</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/airbnbs-ai-powered-photo-tour-using-vision-transformer-e470535f76d4?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="e470535f76d4"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Airbnb’s AI-powered photo tour using Vision Transformer</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Boosting computer vision accuracy and performance at Airbnb</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@ipamda" data-action="show-user-card" data-action-value="3c65755c9172" data-action-type="hover" data-user-id="3c65755c9172" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*6XkbWiOiDTh9wnh1" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Pei Xiong"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@ipamda" data-action="show-user-card" data-action-value="3c65755c9172" data-action-type="hover" data-user-id="3c65755c9172" dir="auto">Pei Xiong</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-13T17:39:08.453Z">Nov 13</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="9 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="a784b2dbe325" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/adopting-bazel-for-web-at-scale-a784b2dbe325?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/adopting-bazel-for-web-at-scale-a784b2dbe325?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*uMA-yyBcSyRjQBwdQnbDdw.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Adopting Bazel for Web at Scale</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/adopting-bazel-for-web-at-scale-a784b2dbe325?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="a784b2dbe325"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Adopting Bazel for Web at Scale</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@sharmila.jesupaul" data-action="show-user-card" data-action-value="1186193d899d" data-action-type="hover" data-user-id="1186193d899d" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*oSKV94STFMJ-V0q6hJPUVA.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sharmila Jesupaul"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@sharmila.jesupaul" data-action="show-user-card" data-action-value="1186193d899d" data-action-type="hover" data-user-id="1186193d899d" dir="auto">Sharmila Jesupaul</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-12T18:22:17.235Z">Nov 12</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="d33ffc4ddb8f" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/transforming-location-retrieval-at-airbnb-a-journey-from-heuristics-to-reinforcement-learning-d33ffc4ddb8f?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/transforming-location-retrieval-at-airbnb-a-journey-from-heuristics-to-reinforcement-learning-d33ffc4ddb8f?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/0*ntAY9EP682xs6adB"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Transforming Location Retrieval at Airbnb: A Journey from Heuristics to Reinforcement Learning</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/transforming-location-retrieval-at-airbnb-a-journey-from-heuristics-to-reinforcement-learning-d33ffc4ddb8f?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="d33ffc4ddb8f"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Transforming Location Retrieval at Airbnb: A Journey from Heuristics to Reinforcement Learning</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@davisdillon" data-action="show-user-card" data-action-value="d1c19d04687e" data-action-type="hover" data-user-id="d1c19d04687e" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*waniwSVN0qtSGdIE" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dillon Davis"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@davisdillon" data-action="show-user-card" data-action-value="d1c19d04687e" data-action-type="hover" data-user-id="d1c19d04687e" dir="auto">Dillon Davis</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-11T18:14:35.417Z">Nov 11</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="9 min read"></span></div></div></div></div></div></div></div></section></div><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><header class="heading heading--borderedBottom u-fontSize18 u-contentSansThin" ><div class="u-clearfix"><div class="heading-content u-floatLeft"><span class="heading-title heading-title--dark heading-title--lineHeightTight u-fontSize18 u-contentSansThin">Open Source</span></div></div></header><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------0-----------------------" data-post-id="84425d66ee11" data-index="0"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/apache-flink-on-kubernetes-84425d66ee11?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/apache-flink-on-kubernetes-84425d66ee11?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*doLL9u-uICR6OPtdXYE4sQ.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Apache Flink® on Kubernetes</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/apache-flink-on-kubernetes-84425d66ee11?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="84425d66ee11"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Apache Flink® on Kubernetes</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@zhangran608" data-action="show-user-card" data-action-value="e6c8d959ca1b" data-action-type="hover" data-user-id="e6c8d959ca1b" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*gL_TwwVXW9ojAt-6TtpsQw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Ran Zhang"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@zhangran608" data-action="show-user-card" data-action-value="e6c8d959ca1b" data-action-type="hover" data-user-id="e6c8d959ca1b" dir="auto">Ran Zhang</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-07-31T17:04:52.286Z">Jul 31</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="d9c4dba859e8" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/chronon-airbnbs-ml-feature-platform-is-now-open-source-d9c4dba859e8?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/chronon-airbnbs-ml-feature-platform-is-now-open-source-d9c4dba859e8?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*KNHSmM_Zx6RuR8XDNSuEwA.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Chronon, Airbnb’s ML Feature Platform, Is Now Open Source</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/chronon-airbnbs-ml-feature-platform-is-now-open-source-d9c4dba859e8?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="d9c4dba859e8"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Chronon, Airbnb’s ML Feature Platform, Is Now Open Source</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@vzanoyan" data-action="show-user-card" data-action-value="d0afc8bb6b1e" data-action-type="hover" data-user-id="d0afc8bb6b1e" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*lDfh0gx9YIYdQH3HfEekNw.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Varant Zanoyan"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@vzanoyan" data-action="show-user-card" data-action-value="d0afc8bb6b1e" data-action-type="hover" data-user-id="d0afc8bb6b1e" dir="auto">Varant Zanoyan</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-04-08T17:18:18.882Z">Apr 8</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="9 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="dc169230bd12" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/airbnbs-trip-to-linaria-dc169230bd12?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/airbnbs-trip-to-linaria-dc169230bd12?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*-qT4pQIPIsxHBZj22sQtag.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Airbnb’s Trip to Linaria</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/airbnbs-trip-to-linaria-dc169230bd12?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="dc169230bd12"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Airbnb’s Trip to Linaria</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@lencioni" data-action="show-user-card" data-action-value="e52389684329" data-action-type="hover" data-user-id="e52389684329" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*r4bT1s_VG5WFqtCX5M-2lA.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Joe Lencioni"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@lencioni" data-action="show-user-card" data-action-value="e52389684329" data-action-type="hover" data-user-id="e52389684329" dir="auto">Joe Lencioni</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2022-06-16T17:41:48.753Z">Jun 16, 2022</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="11 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="d79ae3afa132" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/dynamic-kubernetes-cluster-scaling-at-airbnb-d79ae3afa132?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/dynamic-kubernetes-cluster-scaling-at-airbnb-d79ae3afa132?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*Elojmgc7Y06tItOaLdB0Cw.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Dynamic Kubernetes Cluster Scaling at Airbnb</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/dynamic-kubernetes-cluster-scaling-at-airbnb-d79ae3afa132?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="d79ae3afa132"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Dynamic Kubernetes Cluster Scaling at Airbnb</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Authors: Evan Sheng, David Morrison</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@drmorr-airbnb" data-action="show-user-card" data-action-value="d50bc920fc8f" data-action-type="hover" data-user-id="d50bc920fc8f" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*e-69iB7-RczIzZUB" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of David Morrison"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@drmorr-airbnb" data-action="show-user-card" data-action-value="d50bc920fc8f" data-action-type="hover" data-user-id="d50bc920fc8f" dir="auto">David Morrison</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2022-05-23T17:35:24.292Z">May 23, 2022</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="b351ab739d3f" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/the-past-present-and-future-of-react-dates-b351ab739d3f?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/the-past-present-and-future-of-react-dates-b351ab739d3f?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*VymqCVttV2_VOqmmApgakw.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">The Past, Present, and Future of react-dates</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/the-past-present-and-future-of-react-dates-b351ab739d3f?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="b351ab739d3f"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">The Past, Present, and Future of react-dates</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@backwardok" data-action="show-user-card" data-action-value="23561a2a5df3" data-action-type="hover" data-user-id="23561a2a5df3" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*GggrPYwUfczC4UTKuAuopg.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Diane Ko (she/her)"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@backwardok" data-action="show-user-card" data-action-value="23561a2a5df3" data-action-type="hover" data-user-id="23561a2a5df3" dir="auto">Diane Ko (she/her)</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2022-01-21T17:45:50.218Z">Jan 21, 2022</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="1 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="f6580010ae0c" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://medium.com/airbnb-engineering/meet-ottr-a-serverless-public-key-infrastructure-framework-f6580010ae0c?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://medium.com/airbnb-engineering/meet-ottr-a-serverless-public-key-infrastructure-framework-f6580010ae0c?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*6C4m508jFNo-FtFNIK1acw.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Meet Ottr: A Serverless Public Key Infrastructure Framework</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/airbnb-engineering/meet-ottr-a-serverless-public-key-infrastructure-framework-f6580010ae0c?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="f6580010ae0c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Meet Ottr: A Serverless Public Key Infrastructure Framework</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@yangkenneth" data-action="show-user-card" data-action-value="1528225a7d7a" data-action-type="hover" data-user-id="1528225a7d7a" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*EUeMh5oZABG-bJ5tYB0lTQ.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kenneth Yang"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@yangkenneth" data-action="show-user-card" data-action-value="1528225a7d7a" data-action-type="hover" data-user-id="1528225a7d7a" dir="auto">Kenneth Yang</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2021-10-26T18:09:18.922Z">Oct 26, 2021</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="12 min read"></span></div></div></div></div></div></div></div></section></div></div><style class="js-collectionStyle"> .u-accentColor--borderLight {border-color: #30969A !important;} .u-accentColor--borderNormal {border-color: #30969A !important;} .u-accentColor--borderDark {border-color: #338083 !important;} .u-accentColor--iconLight .svgIcon,.u-accentColor--iconLight.svgIcon {fill: #30969A !important;} .u-accentColor--iconNormal .svgIcon,.u-accentColor--iconNormal.svgIcon {fill: #30969A !important;} .u-accentColor--iconDark .svgIcon,.u-accentColor--iconDark.svgIcon {fill: #338083 !important;} .u-accentColor--textNormal {color: #338083 !important;} .u-accentColor--hoverTextNormal:hover {color: #338083 !important;} .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #337477 !important;} .u-accentColor--textDark {color: #337477 !important;} .u-accentColor--backgroundLight {background-color: #30969A !important;} .u-accentColor--backgroundNormal {background-color: #30969A !important;} .u-accentColor--backgroundDark {background-color: #338083 !important;} .u-accentColor--buttonDark {border-color: #338083 !important; color: #337477 !important;} .u-accentColor--buttonDark:hover {border-color: #337477 !important;} .u-accentColor--buttonDark .icon:before,.u-accentColor--buttonDark .svgIcon{color: #338083 !important; fill: #338083 !important;} .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #30969A !important; color: #338083 !important;} .u-accentColor--buttonNormal:hover {border-color: #338083 !important;} .u-accentColor--buttonNormal .icon:before,.u-accentColor--buttonNormal .svgIcon{color: #30969A !important; fill: #30969A !important;} .u-accentColor--buttonNormal.button--filled .icon:before,.u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonDark.button--filled,.u-accentColor--buttonDark.button--withChrome.is-active,.u-accentColor--fillWhenActive.is-active {background-color: #338083 !important; border-color: #338083 !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #30969A !important; border-color: #30969A !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .postArticle.is-withAccentColors .markup--user,.postArticle.is-withAccentColors .markup--query {color: #338083 !important;}.u-tintBgColor {background-color: rgba(0, 126, 130, 1) !important;}.u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(0, 126, 130, 1) 0%, rgba(0, 126, 130, 0) 100%) !important;}.u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(0, 126, 130, 0) 0%, rgba(0, 126, 130, 1) 100%) !important;} .u-tintSpectrum .u-baseColor--borderLight {border-color: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--borderNormal {border-color: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--borderDark {border-color: #E2F7F7 !important;} .u-tintSpectrum .u-baseColor--iconLight .svgIcon,.u-tintSpectrum .u-baseColor--iconLight.svgIcon {fill: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--iconNormal .svgIcon,.u-tintSpectrum .u-baseColor--iconNormal.svgIcon {fill: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--iconDark .svgIcon,.u-tintSpectrum .u-baseColor--iconDark.svgIcon {fill: #E2F7F7 !important;} .u-tintSpectrum .u-baseColor--textNormal {color: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--textDark {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--textDarker {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--backgroundLight {background-color: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--backgroundNormal {background-color: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--backgroundDark {background-color: #E2F7F7 !important;} .u-tintSpectrum .u-baseColor--buttonLight {border-color: #95C5C7 !important; color: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--buttonLight:hover {border-color: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--buttonLight .icon:before,.u-tintSpectrum .u-baseColor--buttonLight .svgIcon {color: #95C5C7 !important; fill: #95C5C7 !important;} .u-tintSpectrum .u-baseColor--buttonDark {border-color: #E2F7F7 !important; color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--buttonDark:hover {border-color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--buttonDark .icon:before,.u-tintSpectrum .u-baseColor--buttonDark .svgIcon {color: #E2F7F7 !important; fill: #E2F7F7 !important;} .u-tintSpectrum .u-baseColor--buttonNormal {border-color: #BDDFE0 !important; color: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--buttonNormal:hover {border-color: #E2F7F7 !important;} .u-tintSpectrum .u-baseColor--buttonNormal .icon:before,.u-tintSpectrum .u-baseColor--buttonNormal .svgIcon {color: #BDDFE0 !important; fill: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--buttonDark.button--filled,.u-tintSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: #E2F7F7 !important; border-color: #E2F7F7 !important; color: rgba(0, 126, 130, 1) !important; fill: rgba(0, 126, 130, 1) !important;} .u-tintSpectrum .u-baseColor--buttonNormal.button--filled,.u-tintSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: #BDDFE0 !important; border-color: #BDDFE0 !important; color: rgba(0, 126, 130, 1) !important; fill: rgba(0, 126, 130, 1) !important;} .u-tintSpectrum .u-baseColor--link {color: #BDDFE0 !important;} .u-tintSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--darken:active {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--dark {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:active {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--darker {color: #F4FFFF !important;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: #95C5C7;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: #95C5C7;} .u-tintSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: #95C5C7;} .u-tintSpectrum .ui-h1,.u-tintSpectrum .ui-h2,.u-tintSpectrum .ui-h3,.u-tintSpectrum .ui-h4,.u-tintSpectrum .ui-brand1,.u-tintSpectrum .ui-brand2,.u-tintSpectrum .ui-captionStrong {color: #F4FFFF !important; fill: #F4FFFF !important;} .u-tintSpectrum .ui-body,.u-tintSpectrum .ui-caps {color: #F4FFFF !important; fill: #F4FFFF !important;} .u-tintSpectrum .ui-summary,.u-tintSpectrum .ui-caption {color: #95C5C7 !important; fill: #95C5C7 !important;} .u-tintSpectrum .u-accentColor--borderLight {border-color: #95C5C7 !important;} .u-tintSpectrum .u-accentColor--borderNormal {border-color: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--borderDark {border-color: #E2F7F7 !important;} .u-tintSpectrum .u-accentColor--iconLight .svgIcon,.u-tintSpectrum .u-accentColor--iconLight.svgIcon {fill: #95C5C7 !important;} .u-tintSpectrum .u-accentColor--iconNormal .svgIcon,.u-tintSpectrum .u-accentColor--iconNormal.svgIcon {fill: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--iconDark .svgIcon,.u-tintSpectrum .u-accentColor--iconDark.svgIcon {fill: #E2F7F7 !important;} .u-tintSpectrum .u-accentColor--textNormal {color: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--hoverTextNormal:hover {color: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #F4FFFF !important;} .u-tintSpectrum .u-accentColor--textDark {color: #F4FFFF !important;} .u-tintSpectrum .u-accentColor--backgroundLight {background-color: #95C5C7 !important;} .u-tintSpectrum .u-accentColor--backgroundNormal {background-color: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--backgroundDark {background-color: #E2F7F7 !important;} .u-tintSpectrum .u-accentColor--buttonDark {border-color: #E2F7F7 !important; color: #F4FFFF !important;} .u-tintSpectrum .u-accentColor--buttonDark:hover {border-color: #F4FFFF !important;} .u-tintSpectrum .u-accentColor--buttonDark .icon:before,.u-tintSpectrum .u-accentColor--buttonDark .svgIcon{color: #E2F7F7 !important; fill: #E2F7F7 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #BDDFE0 !important; color: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:hover {border-color: #E2F7F7 !important;} .u-tintSpectrum .u-accentColor--buttonNormal .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal .svgIcon{color: #BDDFE0 !important; fill: #BDDFE0 !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 126, 130, 1) !important; fill: rgba(0, 126, 130, 1) !important;} .u-tintSpectrum .u-accentColor--buttonDark.button--filled,.u-tintSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-tintSpectrum .u-accentColor--fillWhenActive.is-active {background-color: #E2F7F7 !important; border-color: #E2F7F7 !important; color: rgba(0, 126, 130, 1) !important; fill: rgba(0, 126, 130, 1) !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-tintSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #BDDFE0 !important; border-color: #BDDFE0 !important; color: rgba(0, 126, 130, 1) !important; fill: rgba(0, 126, 130, 1) !important;} .u-tintSpectrum .postArticle.is-withAccentColors .markup--user,.u-tintSpectrum .postArticle.is-withAccentColors .markup--query {color: #BDDFE0 !important;} .u-accentColor--highlightFaint {background-color: rgba(223, 246, 247, 1) !important;} .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(170, 239, 241, 1) !important;} .postArticle.is-withAccentColors .markup--quote.is-other {background-color: rgba(223, 246, 247, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(223, 246, 247, 1), rgba(223, 246, 247, 1));} .postArticle.is-withAccentColors .markup--quote.is-me {background-color: rgba(195, 242, 244, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(195, 242, 244, 1), rgba(195, 242, 244, 1));} .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: rgba(170, 239, 241, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(170, 239, 241, 1), rgba(170, 239, 241, 1));} .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: rgba(170, 239, 241, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(170, 239, 241, 1), rgba(170, 239, 241, 1));} .postArticle.is-withAccentColors .markup--highlight {background-color: rgba(170, 239, 241, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(170, 239, 241, 1), rgba(170, 239, 241, 1));}</style><style class="js-collectionStyleConstant">.u-imageBgColor {background-color: rgba(0, 0, 0, 0.24705882352941178);} .u-imageSpectrum .u-baseColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconLight .svgIcon,.u-imageSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--iconNormal .svgIcon,.u-imageSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconDark .svgIcon,.u-imageSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDarker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important; color: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--buttonLight .icon:before,.u-imageSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark .icon:before,.u-imageSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal .icon:before,.u-imageSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonDark.button--filled,.u-imageSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--buttonNormal.button--filled,.u-imageSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--link {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .ui-h1,.u-imageSpectrum .ui-h2,.u-imageSpectrum .ui-h3,.u-imageSpectrum .ui-h4,.u-imageSpectrum .ui-brand1,.u-imageSpectrum .ui-brand2,.u-imageSpectrum .ui-captionStrong {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-body,.u-imageSpectrum .ui-caps {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-summary,.u-imageSpectrum .ui-caption {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconLight .svgIcon,.u-imageSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--iconNormal .svgIcon,.u-imageSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconDark .svgIcon,.u-imageSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark .icon:before,.u-imageSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonDark.button--filled,.u-imageSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-imageSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-imageSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .postArticle.is-withAccentColors .markup--user,.u-imageSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--highlightFaint {background-color: rgba(255, 255, 255, 0.2) !important;} .u-imageSpectrum .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(255, 255, 255, 0.6) !important;} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: rgba(255, 255, 255, 0.2) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: rgba(255, 255, 255, 0.4) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}.u-resetSpectrum .u-tintBgColor {background-color: rgba(255, 255, 255, 1) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%) !important;} .u-resetSpectrum .u-baseColor--borderLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderDark {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--iconLight .svgIcon,.u-resetSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconNormal .svgIcon,.u-resetSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconDark .svgIcon,.u-resetSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textNormal {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDarker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--backgroundLight {background-color: rgba(0, 0, 0, 0.09803921568627451) !important;} .u-resetSpectrum .u-baseColor--backgroundNormal {background-color: rgba(0, 0, 0, 0.2) !important;} .u-resetSpectrum .u-baseColor--backgroundDark {background-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight .icon:before,.u-resetSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark {border-color: rgba(0, 0, 0, 0.6) !important; color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--buttonDark .icon:before,.u-resetSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important; color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal .icon:before,.u-resetSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(0, 0, 0, 0.4980392156862745) !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark.button--filled,.u-resetSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2980392156862745) !important; border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--buttonNormal.button--filled,.u-resetSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2) !important; border-color: rgba(0, 0, 0, 0.2) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--link {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--darken:active {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--link.link--darker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .ui-h1,.u-resetSpectrum .ui-h2,.u-resetSpectrum .ui-h3,.u-resetSpectrum .ui-h4,.u-resetSpectrum .ui-brand1,.u-resetSpectrum .ui-brand2,.u-resetSpectrum .ui-captionStrong {color: rgba(0, 0, 0, 0.8) !important; fill: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .ui-body,.u-resetSpectrum .ui-caps {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .ui-summary,.u-resetSpectrum .ui-caption {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-accentColor--borderLight {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderNormal {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderDark {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconLight .svgIcon,.u-resetSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--iconNormal .svgIcon,.u-resetSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconDark .svgIcon,.u-resetSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textDark {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundLight {background-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundNormal {background-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundDark {background-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark {border-color: rgba(17, 128, 14, 1) !important; color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark .icon:before,.u-resetSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(15, 115, 12, 1) !important; fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(26, 137, 23, 1) !important; color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(17, 128, 14, 1) !important; fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark.button--filled,.u-resetSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-resetSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(15, 115, 12, 1) !important; border-color: rgba(15, 115, 12, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-resetSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(17, 128, 14, 1) !important; border-color: rgba(17, 128, 14, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .postArticle.is-withAccentColors .markup--user,.u-resetSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(17, 128, 14, 1) !important;}</style><div class="js-collectionFooter u-hide"><div class="container u-maxWidth1040"><div class="u-marginTop10 u-paddingTop10 u-paddingBottom30 u-borderTopLighter"><div class="linkSet u-clearfix"><div class="u-floatRight u-textColorNormal u-baseColor--textNormal u-xs-floatLeft"><a class="button button--chromeless u-baseColor--buttonNormal u-marginLeft15 u-lineHeight35 u-xs-block u-xs-marginLeft0" href="https://medium.com/airbnb-engineering/about" title="About The Airbnb Tech Blog" aria-label="About The Airbnb Tech Blog">About The Airbnb Tech Blog</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/airbnb-engineering/latest" title="Latest Stories for The Airbnb Tech Blog" aria-label="Latest Stories for The Airbnb Tech Blog">Latest Stories</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/airbnb-engineering/archive" title="Archive for The Airbnb Tech Blog" aria-label="Archive for The Airbnb Tech Blog">Archive</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/about">About Medium</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f">Terms</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9">Privacy</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/business">Teams</a></div></div></div></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[ window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;} // ]]></script><script>// <![CDATA[ var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://medium.com","buildLabel":"20241122-2326-root","currentUser":{"userId":"lo_8c3b1c54f7d3","isVerified":false,"subscriberEmail":"","hasPastMemberships":false,"isEnrolledInHightower":false,"isEligibleForHightower":true,"hightowerLastLockedAt":0,"isWriterProgramEnrolled":true,"isWriterProgramInvited":false,"isWriterProgramOptedOut":false,"writerProgramVersion":0,"writerProgramEnrolledAt":0,"friendLinkOnboarding":0,"hasAdditionalUnlocks":false,"hasApiAccess":false,"writerProgramDistributionSettingOptedIn":false,"isSuspended":false,"collectionOnboardingSeen":0,"atsQualifiedAt":0},"currentUserHasUnverifiedEmail":false,"isAuthenticated":false,"isCurrentUserVerified":false,"miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.jgL7zdhxfcJMjkJjEjB6xg.12.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.fULbttUzdHyewyAazMUYXw.12.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.NQoDXJuDHPBqR63_AdMDaA.12.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.m76-07Q1DcEMKgEwzJjhDA.12.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.2CLT5j6rDReEhG2bjr3NdA.12.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.yrGWoeoBrJB7GBGv--gr1g.12.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.Cc_nfCICljMx7aW6-Pr_9w.12.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.QCX6B3q-KqcSv8hiUNsQ9Q.12.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.nxgYPC9-BrhdicIoMMuzoA.12.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.SOwTEi0SkdYAS9MQpioQXw.12.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.hA1c7rerc_dk3N05UG54qQ.12.js"},"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":false,"termsUrl":"//policy.medium.com/medium-terms-of-service-9db0094a1e0f","textshotHost":"textshot.textshot-production.svc.cluster.local","transactionId":"1732405972792:5be1bcc92e48","useragent":{"browser":"ie","family":"ie","os":"windows","version":7,"supportsDesktopEdit":false,"supportsInteract":false,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":false,"isTier1":false,"clientVersion":"","clientChannel":"","supportsRealScrollEvents":false,"supportsVhUnits":false,"ruinsViewportSections":false,"supportsHtml5Video":false,"supportsMagicUnderlines":false,"isWebView":false,"isFacebookWebView":false,"supportsProgressiveMedia":false,"supportsPromotedPosts":true,"isBot":false,"isNativeIphone":false,"supportsCssVariables":false,"supportsVideoSections":true,"emojiSupportLevel":1,"isSearchBot":false,"isSyndicationBot":false,"isNativeAndroid":false,"isNativeIos":false,"isSeoAuditBot":false,"isInternalApp":false,"supportsApplePay":false,"supportsScrollableMetabar":false},"variants":{"allow_access":true,"allow_signup":true,"allow_test_auth":"disallow","android_enable_editor_new_publishing_flow":true,"android_enable_friend_links_creation":true,"android_enable_friend_links_postpage_banners":true,"android_enable_image_sharer":true,"android_enable_lists_v2":true,"android_enable_syntax_highlight":true,"android_enable_topic_portals":true,"android_rating_prompt_stories_read_threshold":2,"android_two_hour_refresh":true,"available_annual_plan":"2c754bcc2995","available_annual_premium_plan":"4a442ace1476","available_monthly_plan":"60e220181034","available_monthly_premium_plan":"12a660186432","browsable_stream_config_bucket":"curated-topics","can_receive_tips_v0":true,"can_send_tips_v0":true,"coronavirus_topic_recirc":true,"disable_partner_program_enrollment":true,"enable_abandoned_cart_promotion_email":true,"enable_android_dynamic_aspirational_paywall":true,"enable_android_dynamic_programming_paywall":true,"enable_android_miro_v2":true,"enable_android_offline_reading":true,"enable_android_verified_author":true,"enable_app_flirty_thirty":true,"enable_apple_sign_in":true,"enable_apple_webhook":true,"enable_aurora_pub_follower_page":true,"enable_author_cards":true,"enable_author_cards_byline":true,"enable_auto_follow_on_subscribe":true,"enable_automod":true,"enable_bayesian_average_pub_search":true,"enable_bg_post_post":true,"enable_billing_frequency_on_step2":"control","enable_boost_nia_v01":true,"enable_braintree_apple_pay":true,"enable_braintree_client":true,"enable_braintree_google_pay":true,"enable_braintree_integration":true,"enable_braintree_paypal":true,"enable_braintree_trial_membership":true,"enable_braintree_webhook":true,"enable_branch_io":true,"enable_cache_less_following_feed":true,"enable_configure_pronouns":true,"enable_conversion_model_v2":"group_2","enable_conversion_ranker_v2":"control","enable_creator_welcome_email":true,"enable_deprecate_legacy_providers_v3":true,"enable_diversification_rex":true,"enable_entities_to_follow_v2":true,"enable_eventstats_event_processing":true,"enable_explicit_signals":true,"enable_explicit_signals_updated_post_previews":true,"enable_footer_app_buttons":true,"enable_google_one_tap":true,"enable_google_webhook":true,"enable_group_gifting":true,"enable_iceland_forced_android":true,"enable_import":true,"enable_intrinsic_automatic_actions":true,"enable_ios_autorefresh":true,"enable_ios_dynamic_paywall_aspiriational":true,"enable_ios_dynamic_paywall_programming":true,"enable_ios_easy_resubscribe":true,"enable_ios_offline_reading":true,"enable_legacy_feed_in_iceland":true,"enable_lite_archive_page":true,"enable_lite_continue_this_thread":true,"enable_lite_homepage":true,"enable_lite_response_markup":true,"enable_lite_server_upstream_deadlines":true,"enable_lo_homepage":"control","enable_maim_the_meter":true,"enable_marketing_emails":true,"enable_mastodon_avatar_upload":true,"enable_mastodon_for_members":true,"enable_mastodon_for_members_username_selection":true,"enable_medium2_kbfd":true,"enable_members_only_audio":true,"enable_ml_rank_rex_anno":true,"enable_moc_load_processor_all_recs_surfaces":true,"enable_moc_load_processor_c":true,"enable_moc_load_processor_first_story":true,"enable_new_manage_membership_flow":true,"enable_new_stripe_customers":true,"enable_newsletter_lo_flow_custom_domains":true,"enable_pill_based_home_feed":true,"enable_post_bottom_responses":true,"enable_post_bottom_responses_input":true,"enable_pp_country_expansion":true,"enable_pp_v4":true,"enable_pre_pp_v4":true,"enable_premium_tier":true,"enable_premium_tier_badge":true,"enable_publication_hierarchy_web":true,"enable_ranker_v10":"control","enable_recaptcha_enterprise":true,"enable_recirc_model":true,"enable_recommended_publishers_query":true,"enable_rex_aggregator_v2":true,"enable_rex_new_push_notification_endpoint":true,"enable_rex_reading_history":true,"enable_rito_upstream_deadlines":true,"enable_seamless_social_sharing":true,"enable_see_pronouns":true,"enable_sharer_create_post_share_key":true,"enable_sharer_validate_post_share_key":true,"enable_simplified_digest_v2_b":true,"enable_speechify_ios":true,"enable_speechify_widget":true,"enable_sprig":true,"enable_starspace":true,"enable_susi_redesign_android":true,"enable_susi_redesign_ios":true,"enable_switch_plan_premium_tier":true,"enable_tag_recs":true,"enable_tick_landing_page":true,"enable_tipping_v0_android":true,"enable_tipping_v0_ios":true,"enable_tribute_landing_page":true,"enable_update_explore_wtf":true,"enable_update_topic_portals_wtf":true,"enable_updated_pub_recs_ui":true,"enable_verifications_service":true,"glyph_font_set":"m2-unbound-source-serif-pro","goliath_externalsearch_enable_comment_deindexation":true,"ios_display_paywall_after_onboarding":true,"ios_enable_friend_links_creation":true,"ios_enable_friend_links_postpage_banners":true,"ios_enable_home_post_menu":true,"ios_enable_lock_responses":true,"ios_enable_verified_book_author":true,"ios_iceland_nux":true,"ios_in_app_free_trial":true,"ios_remove_twitter_onboarding_step":true,"ios_social_share_sheet":true,"limit_post_referrers":true,"limit_user_follows":true,"mobile_custom_app_icon":true,"num_post_bottom_responses_to_show":"3","onboarding_tags_from_top_views":true,"reader_fair_distribution_non_qp":true,"redefined_top_posts":true,"reengagement_notification_duration":3,"rex_generator_max_candidates":1000,"signin_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","signup_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","skip_fs_cache_user_vals":true},"xsrfToken":"","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","fp":{"/icons/monogram-mask.svg":"https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.12.ico"},"authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":true,"algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"394474ced050e3911ae2249ecc774921","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"G-7JY7T788PK","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js","useDynamicCss":false,"faviconUrl":"https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","faviconImageId":"5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","fontSets":[{"id":8,"url":"https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2-unbound-source-serif-pro.css"},{"id":11,"url":"https://glyph.medium.com/css/m2-unbound-source-serif-pro.css"},{"id":9,"url":"https://glyph.medium.com/css/mkt.css"}],"glyphUrl":"https://glyph.medium.com"},"authBaseUrlRev":"moc.muidem//:sptth","stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","archiveUploadSizeMb":100,"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true},"isAmp":false,"iosScheme":"medium","facebook":{"key":"542599432471018","namespace":"medium-com","scope":{"default":["public_profile","email"],"connect":["public_profile","email"],"login":["public_profile","email"],"share":["public_profile","email"]}},"memberContentTopicId":"13d7efd82fb2","audioContentTopicId":"3792abbd134","isDoNotAuth":false,"buggle":{"videoUrl":"https://cdn-videos-1.medium.com","audioUrl":"https://cdn-audio-1.medium.com"},"referrerType":5,"partnerProgramEmail":"partnerprogram@medium.com","recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","countryCode":"SG","bypassMeter":false,"branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","paypal":{"clientMode":"production","oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com/redeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"}},"collectionConfig":{"mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"]},"bypassMeterWithShareKey":false,"recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","cdcMessaging":[{"text":"For more information on the novel coronavirus and Covid-19, visit ","href":"","type":"text","start":0,"end":0},{"text":"cdc.gov","href":"https://www.cdc.gov/coronavirus/2019-nCoV","type":"link","start":66,"end":73},{"text":".","href":"","type":"text","start":0,"end":0}],"braintree":{"merchantId":"m56f8fqpf7ngnrd4"},"diagnostics":{},"domain":"medium.com"} // ]]></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.jgL7zdhxfcJMjkJjEjB6xg.12.js" async></script><script>// <![CDATA[ window["obvInit"]({"references":{"Collection":{"53c7c27702d5":{"id":"53c7c27702d5","name":"The Airbnb Tech Blog","slug":"airbnb-engineering","tags":["DATA SCIENCE","WEB DEVELOPMENT","OPEN SOURCE","FRONT END DEVELOPMENT","ARTIFICIAL INTELLIGENCE"],"creatorId":"ebe93072cafd","description":"Creative engineers and data scientists building a world where you can belong anywhere. http://airbnb.io","shortDescription":"Creative engineers and data scientists building a world…","image":{"imageId":"1*MlNQKg-sieBGW5prWoe9HQ.jpeg","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":148669,"activeAt":1732130847454},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"1*JZl-TXoSiG0VmYn3qWLdTA.png","filter":"","backgroundSize":"","originalWidth":280,"originalHeight":280,"strategy":"resample","height":0,"width":0},"twitterUsername":"AirbnbEng","facebookPageName":"AirbnbTech","collectionMastheadId":"7e48cc52dce0","sections":[{"type":2,"collectionHeaderMetadata":{"title":"The Airbnb Tech Blog","description":"A deeper look into how our Engineers and Data Scientists build a world of belonging","backgroundImage":{"id":"1*eM5hEN1XX7U9XDPgjcFC8g.png","originalWidth":1520,"originalHeight":492},"logoImage":{"id":"1*5wg57UPTn3EZIWQSgf9mMA@2x.png","originalWidth":566,"originalHeight":584,"alt":"The Airbnb Tech Blog"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":6,"postIds":[],"tagSlug":"Open Source","sectionHeader":"Open Source"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"People","sectionHeader":"People"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"AI","sectionHeader":"Artificial Intelligence and Machine Learning"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Data","sectionHeader":"Data"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Frontend","sectionHeader":"Web"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Mobile","sectionHeader":"Mobile"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Infrastructure","sectionHeader":"Infrastructure"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Fintech","sectionHeader":"Fintech"}}],"tintColor":"#FF007E82","lightText":false,"favicon":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF30969A","point":0},{"color":"#FF338B8E","point":0.1},{"color":"#FF338083","point":0.2},{"color":"#FF337477","point":0.3},{"color":"#FF31696B","point":0.4},{"color":"#FF2F5D5F","point":0.5},{"color":"#FF2B5153","point":0.6},{"color":"#FF264546","point":0.7},{"color":"#FF203839","point":0.8},{"color":"#FF192B2C","point":0.9},{"color":"#FF101D1D","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF007E82","point":0},{"color":"#FF368D91","point":0.1},{"color":"#FF529C9F","point":0.2},{"color":"#FF6AAAAD","point":0.3},{"color":"#FF80B8BA","point":0.4},{"color":"#FF95C5C7","point":0.5},{"color":"#FFA9D2D4","point":0.6},{"color":"#FFBDDFE0","point":0.7},{"color":"#FFCFEBEC","point":0.8},{"color":"#FFE2F7F7","point":0.9},{"color":"#FFF4FFFF","point":1}],"backgroundColor":"#FF007E82"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F7F8","point":0},{"color":"#FFDFF6F7","point":0.1},{"color":"#FFDAF6F6","point":0.2},{"color":"#FFD5F5F6","point":0.3},{"color":"#FFCFF4F5","point":0.4},{"color":"#FFC9F3F4","point":0.5},{"color":"#FFC3F2F4","point":0.6},{"color":"#FFBDF1F3","point":0.7},{"color":"#FFB7F0F3","point":0.8},{"color":"#FFB1F0F2","point":0.9},{"color":"#FFAAEFF1","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4EAEB2","point":0},{"color":"#FF62B6B9","point":0.1},{"color":"#FF73BDC0","point":0.2},{"color":"#FF84C4C7","point":0.3},{"color":"#FF93CBCD","point":0.4},{"color":"#FFA1D2D3","point":0.5},{"color":"#FFAFD8DA","point":0.6},{"color":"#FFBDDFE0","point":0.7},{"color":"#FFCAE5E6","point":0.8},{"color":"#FFD7ECEC","point":0.9},{"color":"#FFE3F2F2","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":4,"title":"Data","url":"https://medium.com/airbnb-engineering/data/home","topicId":"23a094f20d66","source":"topicId"},{"type":4,"title":"AI & ML","url":"https://medium.com/airbnb-engineering/ai/home","topicId":"fa81dc8a53b3","source":"topicId"},{"type":1,"title":"Mobile","tagSlug":"mobile","url":"https://medium.com/airbnb-engineering/tagged/mobile","source":"tagSlug"},{"type":4,"title":"Web","url":"https://medium.com/airbnb-engineering/web/home","topicId":"1a5b002f7f36","source":"topicId"},{"type":4,"title":"Infrastructure","url":"https://medium.com/airbnb-engineering/airbnb-engineering-infrastructure/home","topicId":"439dc2e252ab","source":"topicId"},{"type":4,"title":"Open Source","url":"https://medium.com/airbnb-engineering/open-source/home","topicId":"3cb92d13faa8","source":"topicId"},{"type":4,"title":"People","url":"https://medium.com/airbnb-engineering/medium-com-airbnb-engineering-people/home","topicId":"b380931c02f5","source":"topicId"},{"type":3,"title":"Careers","url":"https://careers.airbnb.com/"}],"colorBehavior":1,"collectionFeatures":[25],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"title":"The Airbnb Tech Blog","description":"A deeper look into how our Engineers and Data Scientists build a world of belonging","backgroundImage":{"id":"1*eM5hEN1XX7U9XDPgjcFC8g.png","originalWidth":1520,"originalHeight":492},"logoImage":{"id":"1*5wg57UPTn3EZIWQSgf9mMA@2x.png","originalWidth":566,"originalHeight":584,"alt":"The Airbnb Tech Blog"},"alignment":2,"layout":5},"subscriberCount":148669,"tagline":"Creative engineers and data scientists building a world…","isOptedIntoAurora":false,"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092925180,"type":"Collection"}},"User":{"ffe99664019a":{"userId":"ffe99664019a","name":"Kidai Kwon","username":"kidaikwon36","createdAt":1693437891561,"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"3c65755c9172":{"userId":"3c65755c9172","name":"Pei Xiong","username":"ipamda","createdAt":1725643999213,"imageId":"0*6XkbWiOiDTh9wnh1","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"1186193d899d":{"userId":"1186193d899d","name":"Sharmila Jesupaul","username":"sharmila.jesupaul","createdAt":1731012293529,"imageId":"1*oSKV94STFMJ-V0q6hJPUVA.png","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"d1c19d04687e":{"userId":"d1c19d04687e","name":"Dillon Davis","username":"davisdillon","createdAt":1724272561032,"imageId":"0*waniwSVN0qtSGdIE","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1730933673369,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"e6c8d959ca1b":{"userId":"e6c8d959ca1b","name":"Ran Zhang","username":"zhangran608","createdAt":1529597314710,"imageId":"1*gL_TwwVXW9ojAt-6TtpsQw.png","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[8,32,29,30,2],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"d0afc8bb6b1e":{"userId":"d0afc8bb6b1e","name":"Varant Zanoyan","username":"vzanoyan","createdAt":1600815133065,"imageId":"1*lDfh0gx9YIYdQH3HfEekNw.jpeg","backgroundImageId":"","bio":"ML Infrastructure @ Airbnb. Formerly Palantir.","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[8,5,29,2],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"e52389684329":{"userId":"e52389684329","name":"Joe Lencioni","username":"lencioni","createdAt":1370638528486,"imageId":"1*r4bT1s_VG5WFqtCX5M-2lA.jpeg","backgroundImageId":"","bio":"Web infrastructure at @airbnb. Making web since the 90s. Co-created happo.io. he/him Minnesotan, liberal, dad. Follow @lencioni on Twitter.","twitterScreenName":"lencioni","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"Joe Lencioni","optInToIceland":true,"subdomainCreatedAt":1609864556831,"hasCompletedProfile":false,"userDismissableFlags":[29,12,8,21,3,2,18,1],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"d50bc920fc8f":{"userId":"d50bc920fc8f","name":"David Morrison","username":"drmorr-airbnb","createdAt":1653318281270,"imageId":"0*e-69iB7-RczIzZUB","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[2,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"23561a2a5df3":{"userId":"23561a2a5df3","name":"Diane Ko (she/her)","username":"backwardok","createdAt":1457107623404,"imageId":"1*GggrPYwUfczC4UTKuAuopg.png","backgroundImageId":"","bio":"Frontend engineer. Accessibility advocate. Rabbit owner. Bay Area native. @backwardok@mastodon.online on Mastodon","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29,12,2,18,1],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"1528225a7d7a":{"userId":"1528225a7d7a","name":"Kenneth Yang","username":"yangkenneth","createdAt":1634146620869,"imageId":"1*EUeMh5oZABG-bJ5tYB0lTQ.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1635211011626,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[8,7,21,12,2,18],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"}},"Post":{"b236078ec82b":{"id":"b236078ec82b","versionId":"139fa1de76fd","creatorId":"ffe99664019a","homeCollectionId":"53c7c27702d5","title":"Building a User Signals Platform at Airbnb","detectedLanguage":"en","latestVersion":"139fa1de76fd","latestPublishedVersion":"139fa1de76fd","hasUnpublishedEdits":false,"latestRev":375,"createdAt":1732128570672,"updatedAt":1732157263686,"acceptedAt":0,"firstPublishedAt":1732130847368,"latestPublishedAt":1732130847368,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"How Airbnb built a stream processing platform to power user personalization.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*ZDusO7LglpaC7sF7","filter":"","backgroundSize":"","originalWidth":1600,"originalHeight":1200,"strategy":"resample","height":0,"width":0},"wordCount":1966,"imageCount":6,"readingTime":8.3688679245283,"subtitle":"How Airbnb built a stream processing platform to power user personalization.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":13,"isBookmarked":false,"tags":[{"slug":"ai","name":"AI","postCount":428141,"metadata":{"postCount":428141,"coverImage":{"id":"0*Zs_B6zDXGdgkK2jv","originalWidth":5120,"originalHeight":2880,"isFeatured":true,"unsplashPhotoId":"_nWaeTF6qo0"}},"type":"Tag"},{"slug":"machine-learning","name":"Machine Learning","postCount":353579,"metadata":{"postCount":353579,"coverImage":{"id":"1*8yJrgGPFwHBY8lpIFg7ERQ.png","originalWidth":940,"originalHeight":788,"isFeatured":true}},"type":"Tag"},{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"},{"slug":"technology","name":"Technology","postCount":2697461,"metadata":{"postCount":2697461,"coverImage":{"id":"1*yH2cmH1uhoFpR7HIseOAsw.jpeg"}},"type":"Tag"},{"slug":"personalization","name":"Personalization","postCount":5369,"metadata":{"postCount":5369,"coverImage":{"id":"0*R8A-0t7tT7Rw36q2","originalWidth":4541,"originalHeight":2552,"isFeatured":true,"unsplashPhotoId":"g8N5ej-TV2s"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":4,"links":{"entries":[{"url":"https://en.wikipedia.org/wiki/Lambda_architecture","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/Key%E2%80%93value_database","alts":[],"httpStatus":200},{"url":"https://kafka.apache.org/","alts":[],"httpStatus":200},{"url":"https://spark.apache.org/","alts":[],"httpStatus":200},{"url":"https://flink.apache.org/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732130847578},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":128,"sectionCount":2,"readingList":0,"topics":[]},"coverless":true,"slug":"building-a-user-signals-platform-at-airbnb","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"building-a-user-signals-platform-at-airbnb-b236078ec82b","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*ZDusO7LglpaC7sF7","originalWidth":1600,"originalHeight":1200,"isFeatured":true}},{"name":"a42f","type":3,"text":"Building a User Signals Platform at Airbnb","markups":[],"alignment":1},{"name":"4ec5","type":1,"text":"How Airbnb built a stream processing platform to power user personalization.","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"How Airbnb built a stream processing platform to power user personalization."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"a42f","type":3,"text":"Building a User Signals Platform at Airbnb","markups":[]},{"name":"4ec5","type":1,"text":"How Airbnb built a stream processing platform to power user personalization.","markups":[]},{"name":"bd3d","type":1,"text":"By: Kidai Kwon, Pavan Tambay, Xinrui Hua, Soumyadip (Soumo) Banerjee, Phanindra (Phani) Ganti","markups":[{"type":1,"start":0,"end":3}]},{"name":"57a9","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*ZDusO7LglpaC7sF7","originalWidth":1600,"originalHeight":1200,"isFeatured":true}},{"name":"7135","type":3,"text":"Overview","markups":[]},{"name":"700b","type":1,"text":"Understanding user actions is critical for delivering a more personalized product experience. In this blog, we will explore how Airbnb developed a large-scale, near real-time stream…","markups":[]}],"sections":[{"name":"1932","startIndex":0},{"name":"b8dc","startIndex":1}]},"isFullContent":false,"subtitle":"How Airbnb built a stream processing platform to power user personalization."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"e470535f76d4":{"id":"e470535f76d4","versionId":"4f8e588c8cde","creatorId":"3c65755c9172","homeCollectionId":"53c7c27702d5","title":"Airbnb’s AI-powered photo tour using Vision Transformer","detectedLanguage":"en","latestVersion":"4f8e588c8cde","latestPublishedVersion":"4f8e588c8cde","hasUnpublishedEdits":false,"latestRev":237,"createdAt":1731438377752,"updatedAt":1731552534724,"acceptedAt":0,"firstPublishedAt":1731519548453,"latestPublishedAt":1731519548453,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Boosting computer vision accuracy and performance at Airbnb","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*QSGRcScNdh7js2oG","filter":"","backgroundSize":"","originalWidth":1600,"originalHeight":1066,"strategy":"resample","height":0,"width":0},"wordCount":1877,"imageCount":10,"readingTime":8.33301886792453,"subtitle":"Boosting computer vision accuracy and performance at Airbnb","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":10,"isBookmarked":false,"tags":[{"slug":"computer-vision","name":"Computer Vision","postCount":24539,"metadata":{"postCount":24539,"coverImage":{"id":"1*6fkBBwc-SL3EXgolnK7r6g.jpeg","originalWidth":824,"originalHeight":408}},"type":"Tag"},{"slug":"ai","name":"AI","postCount":428141,"metadata":{"postCount":428141,"coverImage":{"id":"0*Zs_B6zDXGdgkK2jv","originalWidth":5120,"originalHeight":2880,"isFeatured":true,"unsplashPhotoId":"_nWaeTF6qo0"}},"type":"Tag"},{"slug":"machine-learning","name":"Machine Learning","postCount":353579,"metadata":{"postCount":353579,"coverImage":{"id":"1*8yJrgGPFwHBY8lpIFg7ERQ.png","originalWidth":940,"originalHeight":788,"isFeatured":true}},"type":"Tag"},{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"},{"slug":"technology","name":"Technology","postCount":2697461,"metadata":{"postCount":2697461,"coverImage":{"id":"1*yH2cmH1uhoFpR7HIseOAsw.jpeg"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://arxiv.org/abs/2301.00808","alts":[],"httpStatus":200},{"url":"https://arxiv.org/abs/2010.11929","alts":[],"httpStatus":200},{"url":"https://arxiv.org/abs/2204.01697","alts":[],"httpStatus":200},{"url":"https://www.airbnb.co.in/help/article/3509","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/","alts":[],"httpStatus":200},{"url":"https://news.airbnb.com/en-in/airbnb-2023-winter-release-introducing-guest-favorites-a-collection-of-the-2-million-most-loved-homes-on-airbnb/","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/peixiong/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/lifanyang/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/jian-zhang-3b013b2a/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/deanchen1/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/xiaoxinyin/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/luzhangtracy/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1731519549582},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":62,"sectionCount":1,"readingList":0,"topics":[{"topicId":"1af65db9c2f8","slug":"artificial-intelligence","createdAt":1487916832419,"deletedAt":0,"image":{"id":"1*A28aHchbaA8zNVXraBq0Ug@2x.jpeg","originalWidth":4866,"originalHeight":3244},"name":"Artificial Intelligence","description":"Born to be bot.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"AI News and Artificial Intelligence Articles — Medium","type":"Topic"},{"topicId":"1eca0103fff3","slug":"machine-learning","createdAt":1534449726145,"deletedAt":0,"image":{"id":"1*gFJS3amhZEg_z39D5EErVg@2x.png","originalWidth":2800,"originalHeight":1750},"name":"Machine Learning","description":"Teaching the learners.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Machine Learning News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"airbnbs-ai-powered-photo-tour-using-vision-transformer","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"airbnbs-ai-powered-photo-tour-using-vision-transformer-e470535f76d4","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*QSGRcScNdh7js2oG","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},{"name":"9baa","type":3,"text":"Airbnb’s AI-powered photo tour using Vision Transformer","markups":[{"type":1,"start":0,"end":55}],"alignment":1},{"name":"168a","type":13,"text":"Boosting computer vision accuracy and…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Boosting computer vision accuracy and performance at Airbnb"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"9baa","type":3,"text":"Airbnb’s AI-powered photo tour using Vision Transformer","markups":[{"type":1,"start":0,"end":55}]},{"name":"168a","type":13,"text":"Boosting computer vision accuracy and performance at Airbnb","markups":[]},{"name":"b9a6","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*QSGRcScNdh7js2oG","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},{"name":"2850","type":1,"text":"By: Pei Xiong, Aaron Yin, Jian Zhang, Lifan Yang, Lu Zhang, Dean Chen","markups":[{"type":3,"start":4,"end":13,"href":"https://www.linkedin.com/in/peixiong/","title":"","rel":"","anchorType":0},{"type":3,"start":15,"end":24,"href":"https://www.linkedin.com/in/xiaoxinyin/","title":"","rel":"","anchorType":0},{"type":3,"start":26,"end":36,"href":"https://www.linkedin.com/in/jian-zhang-3b013b2a/","title":"","rel":"","anchorType":0},{"type":3,"start":38,"end":48,"href":"https://www.linkedin.com/in/lifanyang/","title":"","rel":"","anchorType":0},{"type":3,"start":50,"end":58,"href":"https://www.linkedin.com/in/luzhangtracy/","title":"","rel":"","anchorType":0},{"type":3,"start":60,"end":69,"href":"https://www.linkedin.com/in/deanchen1/","title":"","rel":"","anchorType":0},{"type":1,"start":0,"end":3}]},{"name":"e8b2","type":3,"text":"Introduction","markups":[]},{"name":"5d06","type":1,"text":"In recent years, the integration of artificial intelligence with travel platforms has transformed how people search for and book accommodations. As a leading global marketplace for unique travel experiences and accommodations, Airbnb constantly strives to enhance the…","markups":[{"type":3,"start":469,"end":490,"href":"https://www.airbnb.co.in/help/article/3509","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"870d","startIndex":0}]},"isFullContent":false,"subtitle":"Boosting computer vision accuracy and performance at Airbnb"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"a784b2dbe325":{"id":"a784b2dbe325","versionId":"540c54e0e4f6","creatorId":"1186193d899d","homeCollectionId":"53c7c27702d5","title":"Adopting Bazel for Web at Scale","detectedLanguage":"en","latestVersion":"540c54e0e4f6","latestPublishedVersion":"540c54e0e4f6","hasUnpublishedEdits":false,"latestRev":302,"createdAt":1731379317931,"updatedAt":1731655041051,"acceptedAt":0,"firstPublishedAt":1731435737235,"latestPublishedAt":1731448187261,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*uMA-yyBcSyRjQBwdQnbDdw.jpeg","filter":"","backgroundSize":"","originalWidth":1440,"originalHeight":960,"strategy":"resample","height":0,"width":0},"wordCount":2352,"imageCount":6,"readingTime":9.825471698113207,"subtitle":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":29,"isBookmarked":false,"tags":[{"slug":"bazel","name":"Bazel","postCount":279,"metadata":{"postCount":279,"coverImage":{"id":"1*uMA-yyBcSyRjQBwdQnbDdw.jpeg","originalWidth":1440,"originalHeight":960,"isFeatured":true,"alt":"A person making pesto sauce with a mortar and pestle"}},"type":"Tag"},{"slug":"web","name":"Web","postCount":32484,"metadata":{"postCount":32484,"coverImage":{"id":"1*ssOIpEXVVDbYhuTyuZsigQ.png","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"alt":"Best layout settings for web design landing pages"}},"type":"Tag"},{"slug":"typescript","name":"Typescript","postCount":39354,"metadata":{"postCount":39354,"coverImage":{"id":"1*IKZuN_kzUYPl37lBXQkymQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true,"alt":"Banner with the Angular logo saying “v19 is now available”"}},"type":"Tag"},{"slug":"migration","name":"Migration","postCount":15599,"metadata":{"postCount":15599,"coverImage":{"id":"1*AqSfu0IdkrKL9lTTgZVD8g.jpeg","originalWidth":1741,"originalHeight":1080,"isFeatured":true}},"type":"Tag"},{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":6,"links":{"entries":[{"url":"https://facebook.github.io/watchman/","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/Feedback_arc_set","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/Directed_acyclic_graph","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/NP-completeness","alts":[],"httpStatus":200},{"url":"https://eslint.org/","alts":[],"httpStatus":200},{"url":"https://jestjs.io","alts":[],"httpStatus":200},{"url":"https://jestjs.io/","alts":[],"httpStatus":200},{"url":"https://nodejs.org/api/cli.html#--preserve-symlinks","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/sharmilajesupaul/","alts":[],"httpStatus":429},{"url":"https://blog.engflow.com/2023/06/01/bazel-community-day--san-francisco/#taming-node_modules-in-rbe-airbnbs-journey-sharmila-jesupaul-airbnb","alts":[],"httpStatus":200},{"url":"https://www.typescriptlang.org/tsconfig/#listFiles","alts":[],"httpStatus":200},{"url":"https://gist.github.com/brieb/3c0fdb614122e928b4546c5d85c97ab3","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/SquashFS","alts":[],"httpStatus":200},{"url":"https://gist.github.com/brieb/8439c7869fa058554c58377fb52a3c84","alts":[],"httpStatus":200},{"url":"https://bazel.build/remote/rbe","alts":[],"httpStatus":200},{"url":"https://github.com/jestjs/jest/tree/main/packages/jest-haste-map","alts":[],"httpStatus":200},{"url":"https://github.com/jestjs/jest/tree/main/packages/babel-jest","alts":[],"httpStatus":200},{"url":"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/extensions.md","alts":[],"httpStatus":200},{"url":"https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/export.md","alts":[],"httpStatus":200},{"url":"https://github.com/facebook/zstd","alts":[],"httpStatus":200},{"url":"https://bazel.build/","alts":[],"httpStatus":200},{"url":"https://github.com/zhenv5/breaking_cycles_in_noisy_hierarchies","alts":[],"httpStatus":200},{"url":"https://a0.muscache.com/im/pictures/airbnb-platform-assets/AirbnbPlatformAssets-Bazel%20blogpost/original/6826576e-79dc-4382-bc37-a62d9be3f597.png","alts":[],"httpStatus":200},{"url":"https://github.com/jestjs/jest/blob/main/packages/jest-haste-map/src/lib/dependencyExtractor.ts","alts":[],"httpStatus":200},{"url":"https://github.com/bazelbuild/rules_nodejs/blob/5.x/nodejs/private/ts_project.bzl","alts":[],"httpStatus":200},{"url":"https://github.com/bazelbuild/bazel-gazelle?tab=readme-ov-file#keep-comments","alts":[],"httpStatus":200},{"url":"https://github.com/bazelbuild/bazel-gazelle","alts":[],"httpStatus":200},{"url":"https://github.com/nodejs/node-gyp","alts":[],"httpStatus":200},{"url":"https://github.com/aspect-build/rules_ts","alts":[],"httpStatus":200},{"url":"https://dl.acm.org/doi/pdf/10.1145/3091478.3091495","alts":[],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/faster-javascript-builds-with-metro-cfc46d617a1f","alts":[{"type":3,"url":"medium://p/cfc46d617a1f"},{"type":2,"url":"medium://p/cfc46d617a1f"}],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/migrating-our-ios-build-system-from-buck-to-bazel-ddd6f3f25aa3","alts":[{"type":3,"url":"medium://p/ddd6f3f25aa3"},{"type":2,"url":"medium://p/ddd6f3f25aa3"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/bbunge/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1731448188074},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":389,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"adopting-bazel-for-web-at-scale","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"adopting-bazel-for-web-at-scale-a784b2dbe325","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*uMA-yyBcSyRjQBwdQnbDdw.jpeg","originalWidth":1440,"originalHeight":960,"isFeatured":true,"alt":"A person making pesto sauce with a mortar and pestle"}},{"name":"cde1","type":3,"text":"Adopting Bazel for Web at Scale","markups":[],"alignment":1},{"name":"dfaa","type":13,"text":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"ad32","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*uMA-yyBcSyRjQBwdQnbDdw.jpeg","originalWidth":1440,"originalHeight":960,"isFeatured":true,"alt":"A person making pesto sauce with a mortar and pestle"}},{"name":"cde1","type":3,"text":"Adopting Bazel for Web at Scale","markups":[]},{"name":"dfaa","type":13,"text":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel","markups":[]},{"name":"3dee","type":1,"text":"By: Brie Bunge and Sharmila Jesupaul","markups":[{"type":3,"start":4,"end":14,"href":"https://www.linkedin.com/in/bbunge/","title":"","rel":"","anchorType":0},{"type":3,"start":19,"end":36,"href":"https://www.linkedin.com/in/sharmilajesupaul/","title":"","rel":"","anchorType":0},{"type":1,"start":0,"end":3}]},{"name":"227d","type":3,"text":"Introduction","markups":[]},{"name":"ab69","type":1,"text":"At Airbnb, we’ve recently adopted Bazel — Google’s open source build tool–as our universal build system across backend, web, and iOS platforms. This post will cover our experience adopting Bazel for Airbnb’s large-scale (over 11 million lines of code) web monorepo. We’ll share how…","markups":[{"type":3,"start":34,"end":39,"href":"https://bazel.build/","title":"","rel":"","anchorType":0},{"type":3,"start":129,"end":132,"href":"https://medium.com/airbnb-engineering/migrating-our-ios-build-system-from-buck-to-bazel-ddd6f3f25aa3","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"d18a","startIndex":0}]},"isFullContent":false,"subtitle":"How and Why We Migrated Airbnb’s Large-Scale Web Monorepo to Bazel"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"d33ffc4ddb8f":{"id":"d33ffc4ddb8f","versionId":"a4475dd4665a","creatorId":"d1c19d04687e","homeCollectionId":"53c7c27702d5","title":"Transforming Location Retrieval at Airbnb: A Journey from Heuristics to Reinforcement Learning","detectedLanguage":"en","latestVersion":"a4475dd4665a","latestPublishedVersion":"a4475dd4665a","hasUnpublishedEdits":false,"latestRev":206,"createdAt":1731348649294,"updatedAt":1731616783957,"acceptedAt":0,"firstPublishedAt":1731348875417,"latestPublishedAt":1731357386053,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*ntAY9EP682xs6adB","filter":"","backgroundSize":"","originalWidth":1600,"originalHeight":1066,"strategy":"resample","height":0,"width":0},"wordCount":1826,"imageCount":11,"readingTime":8.190566037735849,"subtitle":"How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":9,"isBookmarked":false,"tags":[{"slug":"search-engines","name":"Search Engines","postCount":5863,"metadata":{"postCount":5863,"coverImage":{"id":"1*YQH6-bv6bjVn199pk1uC-Q.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"alt":"Goover — A New Search Engine Challenging Perplexity AI"}},"type":"Tag"},{"slug":"information-retrieval","name":"Information Retrieval","postCount":857,"metadata":{"postCount":857,"coverImage":{"id":"1*dtgu1vA6U5d94yGNdsY-mg.png","originalWidth":1654,"originalHeight":904,"isFeatured":true}},"type":"Tag"},{"slug":"machine-learning","name":"Machine Learning","postCount":353579,"metadata":{"postCount":353579,"coverImage":{"id":"1*8yJrgGPFwHBY8lpIFg7ERQ.png","originalWidth":940,"originalHeight":788,"isFeatured":true}},"type":"Tag"},{"slug":"artificial-intelligence","name":"Artificial Intelligence","postCount":457519,"metadata":{"postCount":457519,"coverImage":{"id":"1*gAn_BSffVBcwCIR6bDgK1g.jpeg"}},"type":"Tag"},{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://careers.airbnb.com/","alts":[],"httpStatus":200},{"url":"https://www.sciencedirect.com/science/article/pii/0196885885900028/pdf?md5=5e944497404774c469271b5074a677a8&pid=1-s2.0-0196885885900028-main.pdf","alts":[],"httpStatus":403},{"url":"https://arxiv.org/abs/1506.02142","alts":[],"httpStatus":200},{"url":"https://arxiv.org/abs/2408.13399","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/dillon-davis/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/han-zhao-692944116/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/malayhaldar/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/alex-shaojie-deng-b572347/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/weiwei-guo/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/thomaslegrand1/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/huiji-gao/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/liweihe/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/sanjeevkatariya/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1731357387040},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":9,"sectionCount":1,"readingList":0,"topics":[{"topicId":"1eca0103fff3","slug":"machine-learning","createdAt":1534449726145,"deletedAt":0,"image":{"id":"1*gFJS3amhZEg_z39D5EErVg@2x.png","originalWidth":2800,"originalHeight":1750},"name":"Machine Learning","description":"Teaching the learners.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Machine Learning News and Articles — Medium","type":"Topic"},{"topicId":"ae5d4995e225","slug":"data-science","createdAt":1493923906289,"deletedAt":0,"image":{"id":"1*NHWOEki_ncCX-xzbKtkEWw@2x.jpeg","originalWidth":5760,"originalHeight":3840},"name":"Data Science","description":"Query this.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Data Science News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"transforming-location-retrieval-at-airbnb-a-journey-from-heuristics-to-reinforcement-learning","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"transforming-location-retrieval-at-airbnb-a-journey-from-heuristics-to-reinforcement-learning-d33ffc4ddb8f","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*ntAY9EP682xs6adB","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},{"name":"887c","type":3,"text":"Transforming Location Retrieval at Airbnb: A Journey from Heuristics to Reinforcement Learning","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"887c","type":3,"text":"Transforming Location Retrieval at Airbnb: A Journey from Heuristics to Reinforcement Learning","markups":[]},{"name":"117c","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*ntAY9EP682xs6adB","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},{"name":"478b","type":1,"text":"How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to provide guests with unique, affordable, and differentiated accommodations around the world.","markups":[]},{"name":"2252","type":1,"text":"By: Dillon Davis, Huiji Gao, Thomas Legrand, Weiwei Guo, Malay Haldar, Alex Deng, Han Zhao, Liwei He, Sanjeev Katariya","markups":[{"type":3,"start":4,"end":16,"href":"https://www.linkedin.com/in/dillon-davis/","title":"","rel":"","anchorType":0},{"type":3,"start":18,"end":28,"href":"https://www.linkedin.com/in/huiji-gao/","title":"","rel":"","anchorType":0},{"type":3,"start":29,"end":43,"href":"https://www.linkedin.com/in/thomaslegrand1/","title":"","rel":"","anchorType":0},{"type":3,"start":45,"end":55,"href":"https://www.linkedin.com/in/weiwei-guo/","title":"","rel":"","anchorType":0},{"type":3,"start":57,"end":69,"href":"https://www.linkedin.com/in/malayhaldar/","title":"","rel":"","anchorType":0},{"type":3,"start":71,"end":80,"href":"https://www.linkedin.com/in/alex-shaojie-deng-b572347/","title":"","rel":"","anchorType":0},{"type":3,"start":82,"end":90,"href":"https://www.linkedin.com/in/han-zhao-692944116/","title":"","rel":"","anchorType":0},{"type":3,"start":92,"end":100,"href":"https://www.linkedin.com/in/liweihe/","title":"","rel":"","anchorType":0},{"type":3,"start":102,"end":118,"href":"https://www.linkedin.com/in/sanjeevkatariya/","title":"","rel":"","anchorType":0},{"type":1,"start":0,"end":3}]},{"name":"70a9","type":3,"text":"Introduction","markups":[]},{"name":"2509","type":1,"text":"Airbnb…","markups":[]}],"sections":[{"name":"997a","startIndex":0}]},"isFullContent":false,"subtitle":"How Airbnb leverages machine learning and reinforcement learning techniques to solve a unique information retrieval task in order to…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"84425d66ee11":{"id":"84425d66ee11","versionId":"ec6aeb4db960","creatorId":"e6c8d959ca1b","homeCollectionId":"53c7c27702d5","title":"Apache Flink® on Kubernetes","detectedLanguage":"en","latestVersion":"ec6aeb4db960","latestPublishedVersion":"ec6aeb4db960","hasUnpublishedEdits":false,"latestRev":254,"createdAt":1722379168169,"updatedAt":1732024326089,"acceptedAt":0,"firstPublishedAt":1722445492286,"latestPublishedAt":1722445492286,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*doLL9u-uICR6OPtdXYE4sQ.jpeg","filter":"","backgroundSize":"","originalWidth":6163,"originalHeight":4109,"strategy":"resample","height":0,"width":0},"wordCount":2161,"imageCount":9,"readingTime":9.354716981132075,"subtitle":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":22,"isBookmarked":false,"tags":[{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"},{"slug":"kubernetes","name":"Kubernetes","postCount":60026,"metadata":{"postCount":60026,"coverImage":{"id":"1*cIhkPCDHi-1iMsCj-NdDPw.png","originalWidth":1408,"originalHeight":543,"isFeatured":true}},"type":"Tag"},{"slug":"apache","name":"Apache","postCount":5228,"metadata":{"postCount":5228,"coverImage":{"id":"0*9NZsKcra5AsdquGC","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"Talnaz9Bug0"}},"type":"Tag"},{"slug":"infrastructure","name":"Infrastructure","postCount":14733,"metadata":{"postCount":14733,"coverImage":{"id":"0*QsqFF3ZJ_vOR_y7i","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":3,"links":{"entries":[{"url":"https://airflow.apache.org/","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/","alts":[],"httpStatus":200},{"url":"https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html","alts":[],"httpStatus":200},{"url":"https://kubernetes.io/","alts":[],"httpStatus":200},{"url":"https://nightlies.apache.org/flink/flink-docs-stable/","alts":[],"httpStatus":200},{"url":"https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main/","alts":[],"httpStatus":200},{"url":"https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/standalone/kubernetes/","alts":[],"httpStatus":200},{"url":"https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/elastic_scaling/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1722445492881},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":80,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"apache-flink-on-kubernetes","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"apache-flink-on-kubernetes-84425d66ee11","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*doLL9u-uICR6OPtdXYE4sQ.jpeg","originalWidth":6163,"originalHeight":4109,"isFeatured":true}},{"name":"c654","type":3,"text":"Apache Flink® on Kubernetes","markups":[{"type":1,"start":0,"end":27}],"alignment":1},{"name":"e165","type":1,"text":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn","markups":[{"type":1,"start":0,"end":69}],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"c654","type":3,"text":"Apache Flink® on Kubernetes","markups":[{"type":1,"start":0,"end":27}]},{"name":"e165","type":1,"text":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn","markups":[{"type":1,"start":0,"end":69}]},{"name":"7b34","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*doLL9u-uICR6OPtdXYE4sQ.jpeg","originalWidth":6163,"originalHeight":4109,"isFeatured":true}},{"name":"aa15","type":3,"text":"Introduction","markups":[]},{"name":"23ea","type":1,"text":"At Airbnb, Apache Flink was introduced in 2018 as a supplementary solution for stream processing. It ran alongside Apache Spark™ Streaming for several years before transitioning to become the primary stream processing platform. In this blog post, we…","markups":[{"type":3,"start":11,"end":23,"href":"https://nightlies.apache.org/flink/flink-docs-stable/","title":"","rel":"","anchorType":0},{"type":3,"start":334,"end":345,"href":"https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html","title":"","rel":"","anchorType":0},{"type":3,"start":372,"end":382,"href":"https://kubernetes.io/","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"36a8","startIndex":0}]},"isFullContent":false,"subtitle":"Airbnb’s Use of A New Flink platform evolved from Apache Hadoop® Yarn"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"d9c4dba859e8":{"id":"d9c4dba859e8","versionId":"69006fa60672","creatorId":"d0afc8bb6b1e","homeCollectionId":"53c7c27702d5","title":"Chronon, Airbnb’s ML Feature Platform, Is Now Open Source","detectedLanguage":"en","latestVersion":"69006fa60672","latestPublishedVersion":"69006fa60672","hasUnpublishedEdits":false,"latestRev":492,"createdAt":1712438945305,"updatedAt":1712636312520,"acceptedAt":0,"firstPublishedAt":1712596698882,"latestPublishedAt":1712611608105,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*KNHSmM_Zx6RuR8XDNSuEwA.jpeg","filter":"","backgroundSize":"","originalWidth":7952,"originalHeight":5304,"strategy":"resample","height":0,"width":0},"wordCount":2178,"imageCount":2,"readingTime":8.602201257861635,"subtitle":"A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":167,"isBookmarked":false,"tags":[{"slug":"machine-learning","name":"Machine Learning","postCount":353579,"metadata":{"postCount":353579,"coverImage":{"id":"1*8yJrgGPFwHBY8lpIFg7ERQ.png","originalWidth":940,"originalHeight":788,"isFeatured":true}},"type":"Tag"},{"slug":"data","name":"Data","postCount":130032,"metadata":{"postCount":130032,"coverImage":{"id":"1*X_tAPVf1mKF22l0pVvauIg.jpeg","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"},{"slug":"ai","name":"AI","postCount":428141,"metadata":{"postCount":428141,"coverImage":{"id":"0*Zs_B6zDXGdgkK2jv","originalWidth":5120,"originalHeight":2880,"isFeatured":true,"unsplashPhotoId":"_nWaeTF6qo0"}},"type":"Tag"},{"slug":"data-engineering","name":"Data Engineering","postCount":38299,"metadata":{"postCount":38299,"coverImage":{"id":"1*3qMVRdadOQK6OaG7pA42aw.jpeg","originalWidth":1280,"originalHeight":1130}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":7,"links":{"entries":[{"url":"mailto:sophie.wang@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:yuli.han@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:haichun.chen@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:vamsee.y@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:hao.cen@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:cristian.figueroa@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:haozhen.ding@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:donghan.zhang@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:pengyu.hou@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:yi.li@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:jack.song@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:henry.saputra@airbnb.com","alts":[],"httpStatus":0},{"url":"mailto:evgeny.shapiro@airbnb.com","alts":[],"httpStatus":0},{"url":"https://careers.airbnb.com/","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/nikhilsimha/","alts":[],"httpStatus":999},{"url":"https://medium.com/airbnb-engineering/chronon-a-declarative-feature-engineering-framework-b7b8ce796e04","alts":[{"type":3,"url":"medium://p/b7b8ce796e04"},{"type":2,"url":"medium://p/b7b8ce796e04"}],"httpStatus":200},{"url":"https://chronon.ai/getting_started/Tutorial.html","alts":[],"httpStatus":200},{"url":"https://www.chronon.ai/getting_started/Tutorial.html","alts":[],"httpStatus":200},{"url":"https://www.chronon.ai","alts":[],"httpStatus":200},{"url":"https://discord.gg/GbmGATNqqP","alts":[],"httpStatus":200},{"url":"https://www.chronon.ai/index.html","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/chronon","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/vzanoyan/","alts":[],"httpStatus":999},{"url":"http://atul.kale@airbnb.com","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1712611608817},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":523,"sectionCount":1,"readingList":0,"topics":[{"topicId":"1eca0103fff3","slug":"machine-learning","createdAt":1534449726145,"deletedAt":0,"image":{"id":"1*gFJS3amhZEg_z39D5EErVg@2x.png","originalWidth":2800,"originalHeight":1750},"name":"Machine Learning","description":"Teaching the learners.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Machine Learning News and Articles — Medium","type":"Topic"},{"topicId":"ae5d4995e225","slug":"data-science","createdAt":1493923906289,"deletedAt":0,"image":{"id":"1*NHWOEki_ncCX-xzbKtkEWw@2x.jpeg","originalWidth":5760,"originalHeight":3840},"name":"Data Science","description":"Query this.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Data Science News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"chronon-airbnbs-ml-feature-platform-is-now-open-source","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"chronon-airbnbs-ml-feature-platform-is-now-open-source-d9c4dba859e8","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*KNHSmM_Zx6RuR8XDNSuEwA.jpeg","originalWidth":7952,"originalHeight":5304,"isFeatured":true}},{"name":"dbec","type":3,"text":"Chronon, Airbnb’s ML Feature Platform, Is Now Open Source","markups":[{"type":1,"start":0,"end":57}],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"dbec","type":3,"text":"Chronon, Airbnb’s ML Feature Platform, Is Now Open Source","markups":[{"type":1,"start":0,"end":57}]},{"name":"4656","type":1,"text":"A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling the complexity of data engineering, and provides low latency streaming.","markups":[]},{"name":"f0a2","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*KNHSmM_Zx6RuR8XDNSuEwA.jpeg","originalWidth":7952,"originalHeight":5304,"isFeatured":true}},{"name":"38c5","type":1,"text":"By: Varant Zanoyan, Nikhil Simha Raprolu","markups":[{"type":3,"start":4,"end":18,"href":"https://www.linkedin.com/in/vzanoyan/","title":"","rel":"noopener","anchorType":0},{"type":3,"start":20,"end":40,"href":"https://www.linkedin.com/in/nikhilsimha/","title":"","rel":"noopener","anchorType":0}]}],"sections":[{"name":"50bd","startIndex":0}]},"isFullContent":false,"subtitle":"A feature platform that offers observability and management tools, allows ML practitioners to use a variety of data sources, while handling…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"dc169230bd12":{"id":"dc169230bd12","versionId":"5a62db7e743d","creatorId":"e52389684329","homeCollectionId":"53c7c27702d5","title":"Airbnb’s Trip to Linaria","detectedLanguage":"en","latestVersion":"5a62db7e743d","latestPublishedVersion":"5a62db7e743d","hasUnpublishedEdits":false,"latestRev":385,"createdAt":1655231569120,"updatedAt":1655401470541,"acceptedAt":0,"firstPublishedAt":1655401308753,"latestPublishedAt":1655401308753,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*-qT4pQIPIsxHBZj22sQtag.jpeg","filter":"","backgroundSize":"","originalWidth":4000,"originalHeight":2670,"strategy":"resample","height":0,"width":0},"wordCount":2584,"imageCount":3,"readingTime":10.300943396226415,"subtitle":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":74,"isBookmarked":false,"tags":[{"slug":"css","name":"CSS","postCount":43109,"metadata":{"postCount":43109,"coverImage":{"id":"1*nEqMdXoOMbrGZhHmHvmqUA.png","originalWidth":1201,"originalHeight":720,"isFeatured":true}},"type":"Tag"},{"slug":"web-performance","name":"Web Performance","postCount":1942,"metadata":{"postCount":1942,"coverImage":{"id":"1*FORjXCa4nSVrQqf3kXeLYQ.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"css-in-js","name":"Css In Js","postCount":432,"metadata":{"postCount":432,"coverImage":{"id":"0*fUw7ErUQdJIW1fVv","originalWidth":5472,"originalHeight":3648,"isFeatured":true,"unsplashPhotoId":"eOpewngf68w"}},"type":"Tag"},{"slug":"atomic-css","name":"Atomic Css","postCount":29,"metadata":{"postCount":29,"coverImage":{"id":"1*-qT4pQIPIsxHBZj22sQtag.jpeg","originalWidth":4000,"originalHeight":2670,"isFeatured":true}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":6,"links":{"entries":[{"url":"https://browserify.org/","alts":[],"httpStatus":200},{"url":"https://emotion.sh/docs/introduction","alts":[],"httpStatus":200},{"url":"https://getbootstrap.com/","alts":[],"httpStatus":200},{"url":"https://www.khanacademy.org/","alts":[],"httpStatus":200},{"url":"https://reactjs.org/docs/profiler.html","alts":[],"httpStatus":200},{"url":"https://reactjs.org/docs/higher-order-components.html","alts":[],"httpStatus":200},{"url":"https://www.speedcurve.com/","alts":[],"httpStatus":200},{"url":"https://xkcd.com/927/","alts":[],"httpStatus":200},{"url":"https://rubyonrails.org/","alts":[],"httpStatus":200},{"url":"https://www.callstack.com/","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/Decision_fatigue","alts":[],"httpStatus":200},{"url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates","alts":[],"httpStatus":200},{"url":"https://sass-lang.com/","alts":[],"httpStatus":200},{"url":"https://web.dev/tbt/","alts":[],"httpStatus":200},{"url":"https://web.dev/performance-scoring/","alts":[],"httpStatus":200},{"url":"https://web.dev/fcp/","alts":[],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=fHQ1WSx41CA","alts":[{"type":3,"url":"vnd.youtube://www.youtube.com/watch?v=fHQ1WSx41CA&feature=applinks"},{"type":2,"url":"vnd.youtube://www.youtube.com/watch?v=fHQ1WSx41CA&feature=applinks"}],"httpStatus":200},{"url":"https://github.com/css-modules/css-modules","alts":[],"httpStatus":200},{"url":"https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity","alts":[],"httpStatus":200},{"url":"http://getbem.com/","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-with-styles","alts":[],"httpStatus":200},{"url":"https://github.com/prettier/prettier/blob/d13feed42b6478710bebbcd3225ab6f203a914c1/src/language-js/embed.js#L90-L121","alts":[],"httpStatus":200},{"url":"https://github.com/khan/aphrodite","alts":[],"httpStatus":200},{"url":"https://github.com/rails/sprockets","alts":[],"httpStatus":200},{"url":"https://github.com/seek-oss/treat","alts":[],"httpStatus":200},{"url":"https://github.com/callstack/linaria#contributors","alts":[],"httpStatus":200},{"url":"https://github.com/callstack/linaria","alts":[],"httpStatus":200},{"url":"https://snyk.io/advisor/npm-package/linaria","alts":[],"httpStatus":200},{"url":"https://css-tricks.com/how-do-you-remove-unused-css-from-a-site/","alts":[],"httpStatus":200},{"url":"https://css-tricks.com/lets-define-exactly-atomic-css/","alts":[],"httpStatus":200},{"url":"https://styled-components.com/","alts":[],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/turbocharged-javascript-refactoring-with-codemods-b0cae8b326b9","alts":[{"type":3,"url":"medium://p/b0cae8b326b9"},{"type":2,"url":"medium://p/b0cae8b326b9"}],"httpStatus":200},{"url":"https://happo.io/","alts":[],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/creating-airbnbs-page-performance-score-5f664be0936","alts":[{"type":3,"url":"medium://p/5f664be0936"},{"type":2,"url":"medium://p/5f664be0936"}],"httpStatus":200},{"url":"https://grnh.se/bbe55fe81us","alts":[],"httpStatus":200},{"url":"https://github.com/callstack/linaria/pull/867","alts":[],"httpStatus":200},{"url":"https://grnh.se/b5afa9151us","alts":[],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/ts-migrate-a-tool-for-migrating-to-typescript-at-scale-cd23bfeb5cc","alts":[{"type":3,"url":"medium://p/cd23bfeb5cc"},{"type":2,"url":"medium://p/cd23bfeb5cc"}],"httpStatus":200},{"url":"https://grnh.se/21e5c2011us","alts":[],"httpStatus":200},{"url":"https://npmjs.com/@linaria/atomic","alts":[],"httpStatus":200},{"url":"https://www.npmjs.com/package/@linaria/core","alts":[],"httpStatus":200},{"url":"https://grnh.se/ebfa55151us","alts":[],"httpStatus":200},{"url":"https://grnh.se/ee114dfc1us","alts":[],"httpStatus":200},{"url":"https://grnh.se/92c32fed1us","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1655401312180},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":512,"sectionCount":2,"readingList":0,"topics":[{"topicId":"55f1c20aba7a","slug":"software-engineering","createdAt":1491949272237,"deletedAt":0,"image":{"id":"1*U8FboK4lz1wqwQC6IcqxKw@2x.jpeg","originalWidth":5507,"originalHeight":3098},"name":"Software Engineering","description":"Back-end to front-end.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Software Engineering News and Articles — Medium","type":"Topic"},{"topicId":"63c6f1f93ee","slug":"javascript","createdAt":1493945704961,"deletedAt":0,"image":{"id":"1*5UyyDJ1ESD11yQNd1UVAaQ@2x.jpeg","originalWidth":5472,"originalHeight":3648},"name":"Javascript","description":"An ode to code.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Javascript News and Articles — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"airbnbs-trip-to-linaria","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"airbnbs-trip-to-linaria-dc169230bd12","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*-qT4pQIPIsxHBZj22sQtag.jpeg","originalWidth":4000,"originalHeight":2670,"isFeatured":true}},{"name":"14e6","type":3,"text":"Airbnb’s Trip to Linaria","markups":[{"type":1,"start":0,"end":24}],"alignment":1},{"name":"0d0b","type":13,"text":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"3269511a9b03","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":3,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"primaryTopicId":"55f1c20aba7a","isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"Airbnb's Trip to Linaria","previewContent2":{"bodyModel":{"paragraphs":[{"name":"14e6","type":3,"text":"Airbnb’s Trip to Linaria","markups":[{"type":1,"start":0,"end":24}]},{"name":"0d0b","type":13,"text":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance","markups":[]},{"name":"1b49","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*-qT4pQIPIsxHBZj22sQtag.jpeg","originalWidth":4000,"originalHeight":2670,"isFeatured":true}},{"name":"655f","type":1,"text":"CSS is a critical component of every web application, and many solutions have evolved for how styles are written by developers and delivered to visitors. In this post we’ll take you through Airbnb’s journey from Sass to CSS-in-JS and show you why we landed on Linaria, a zero-runtime CSS-in-JS library…","markups":[{"type":3,"start":260,"end":301,"href":"https://github.com/callstack/linaria","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"a66f","startIndex":0}]},"isFullContent":false,"subtitle":"Learn how Linaria, Airbnb’s newest choice for web styling, improved both developer experience and web performance"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"d79ae3afa132":{"id":"d79ae3afa132","versionId":"fad2a24ea4e5","creatorId":"d50bc920fc8f","homeCollectionId":"53c7c27702d5","title":"Dynamic Kubernetes Cluster Scaling at Airbnb","detectedLanguage":"en","latestVersion":"fad2a24ea4e5","latestPublishedVersion":"fad2a24ea4e5","hasUnpublishedEdits":false,"latestRev":246,"createdAt":1653318703971,"updatedAt":1653327325350,"acceptedAt":0,"firstPublishedAt":1653327324292,"latestPublishedAt":1653327324292,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Authors: Evan Sheng, David Morrison","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Elojmgc7Y06tItOaLdB0Cw.jpeg","filter":"","backgroundSize":"","originalWidth":1200,"originalHeight":800,"strategy":"resample","height":0,"width":0},"wordCount":2137,"imageCount":6,"readingTime":9.014150943396226,"subtitle":"Authors: Evan Sheng, David Morrison","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":162,"isBookmarked":false,"tags":[{"slug":"kubernetes","name":"Kubernetes","postCount":60026,"metadata":{"postCount":60026,"coverImage":{"id":"1*cIhkPCDHi-1iMsCj-NdDPw.png","originalWidth":1408,"originalHeight":543,"isFeatured":true}},"type":"Tag"},{"slug":"cluster-autoscaler","name":"Cluster Autoscaler","postCount":68,"metadata":{"postCount":68,"coverImage":{"id":"1*TICUvLWD9K260XcBgOvFSw.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"},{"slug":"engineering","name":"Engineering","postCount":56367,"metadata":{"postCount":56367,"coverImage":{"id":"0*qbQTuVlzhFYSkCjL","originalWidth":4896,"originalHeight":3220,"isFeatured":true,"unsplashPhotoId":"KYxXMTpTzek"}},"type":"Tag"},{"slug":"infrastructure","name":"Infrastructure","postCount":14733,"metadata":{"postCount":14733,"coverImage":{"id":"0*QsqFF3ZJ_vOR_y7i","originalWidth":1600,"originalHeight":1066,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://www.linkedin.com/in/evansheng112/","alts":[],"httpStatus":999},{"url":"https://www.linkedin.com/in/david-morrison-9419b110/","alts":[],"httpStatus":999},{"url":"https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/expander/grpcplugin","alts":[],"httpStatus":200},{"url":"http://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/community/tree/master/sig-autoscaling","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/expander/priority","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/positions/3903900/","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-are-expanders","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/blob/68c984472acce69cba89d96d724d25b3c78fc4a0/cluster-autoscaler/proposals/plugable-provider-grpc.md","alts":[],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=GCCSY7ERXj4&ab_channel=CNCF%5BCloudNativeComputingFoundation%5D","alts":[],"httpStatus":429},{"url":"https://github.com/kubernetes/autoscaler","alts":[],"httpStatus":200},{"url":"https://developers.google.com/protocol-buffers/docs/overview","alts":[],"httpStatus":200},{"url":"https://medium.com/airbnb-engineering/a-krispr-approach-to-kubernetes-infrastructure-a0741cff4e0c","alts":[{"type":3,"url":"medium://p/a0741cff4e0c"},{"type":2,"url":"medium://p/a0741cff4e0c"}],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/pull/4489","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/pull/4233","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/pull/4073","alts":[],"httpStatus":200},{"url":"https://github.com/kubernetes/autoscaler/pull/4452","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/positions/3696687/","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/positions/3949745/","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/positions/4168852/","alts":[],"httpStatus":200},{"url":"https://careers.airbnb.com/positions/2623004/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1653327327544},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":547,"sectionCount":1,"readingList":0,"topics":[{"topicId":"55f1c20aba7a","slug":"software-engineering","createdAt":1491949272237,"deletedAt":0,"image":{"id":"1*U8FboK4lz1wqwQC6IcqxKw@2x.jpeg","originalWidth":5507,"originalHeight":3098},"name":"Software Engineering","description":"Back-end to front-end.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Software Engineering News and Articles — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"dynamic-kubernetes-cluster-scaling-at-airbnb","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"dynamic-kubernetes-cluster-scaling-at-airbnb-d79ae3afa132","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Elojmgc7Y06tItOaLdB0Cw.jpeg","originalWidth":1200,"originalHeight":800,"isFeatured":true}},{"name":"1372","type":3,"text":"Dynamic Kubernetes Cluster Scaling at Airbnb","markups":[],"alignment":1},{"name":"c0a3","type":1,"text":"Authors: Evan Sheng, David Morrison","markups":[{"type":3,"start":9,"end":19,"href":"https://www.linkedin.com/in/evansheng112/","title":"","rel":"","anchorType":0},{"type":3,"start":21,"end":35,"href":"https://www.linkedin.com/in/david-morrison-9419b110/","title":"","rel":"","anchorType":0}],"alignment":1},{"name":"b575","type":3,"text":"Introduction","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Authors: Evan Sheng, David Morrison"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":3,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"primaryTopicId":"55f1c20aba7a","isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"1372","type":3,"text":"Dynamic Kubernetes Cluster Scaling at Airbnb","markups":[]},{"name":"c0a3","type":1,"text":"Authors: Evan Sheng, David Morrison","markups":[{"type":3,"start":9,"end":19,"href":"https://www.linkedin.com/in/evansheng112/","title":"","rel":"","anchorType":0},{"type":3,"start":21,"end":35,"href":"https://www.linkedin.com/in/david-morrison-9419b110/","title":"","rel":"","anchorType":0}]},{"name":"c88e","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*Elojmgc7Y06tItOaLdB0Cw.jpeg","originalWidth":1200,"originalHeight":800,"isFeatured":true}},{"name":"b575","type":3,"text":"Introduction","markups":[]},{"name":"7b38","type":1,"text":"An important part of running Airbnb’s infrastructure is ensuring our cloud spending automatically scales with demand, both up and down. Our traffic fluctuates heavily every day, and our cloud footprint should scale dynamically to support this.","markups":[{"type":1,"start":126,"end":130}]},{"name":"1e28","type":1,"text":"To support this scaling, Airbnb utilizes Kubernetes, an open…","markups":[{"type":3,"start":234,"end":238,"href":"https://medium.com/airbnb-engineering/a-krispr-approach-to-kubernetes-infrastructure-a0741cff4e0c","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"598e","startIndex":0}]},"isFullContent":false,"subtitle":"Authors: Evan Sheng, David Morrison"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"b351ab739d3f":{"id":"b351ab739d3f","versionId":"38d261fcf77","creatorId":"23561a2a5df3","homeCollectionId":"53c7c27702d5","title":"The Past, Present, and Future of react-dates","detectedLanguage":"en","latestVersion":"38d261fcf77","latestPublishedVersion":"38d261fcf77","hasUnpublishedEdits":false,"latestRev":32,"createdAt":1641599344238,"updatedAt":1643064260433,"acceptedAt":0,"firstPublishedAt":1642787150218,"latestPublishedAt":1643064258497,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*VymqCVttV2_VOqmmApgakw.jpeg","filter":"","backgroundSize":"","originalWidth":1440,"originalHeight":960,"strategy":"resample","height":0,"width":0},"wordCount":164,"imageCount":1,"readingTime":0.8188679245283019,"subtitle":"In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":17,"isBookmarked":false,"tags":[{"slug":"frontend","name":"Frontend","postCount":17703,"metadata":{"postCount":17703,"coverImage":{"id":"0*lmNSS2nwEYOW2LMc","originalWidth":5472,"originalHeight":3450,"isFeatured":true,"unsplashPhotoId":"vkzceVhkPBs"}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"},{"slug":"front-end-development","name":"Front End Development","postCount":49846,"metadata":{"postCount":49846,"coverImage":{"id":"0*lcEq379w0DVfynap","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"KPAQpJYzH0Y"}},"type":"Tag"},{"slug":"javascript","name":"JavaScript","postCount":285127,"metadata":{"postCount":285127,"coverImage":{"id":"1*IKZuN_kzUYPl37lBXQkymQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true,"alt":"Banner with the Angular logo saying “v19 is now available”"}},"type":"Tag"},{"slug":"react","name":"React","postCount":109363,"metadata":{"postCount":109363,"coverImage":{"id":"1*J4iv2zMdrn03fiRUCTTGBw.jpeg","originalWidth":626,"originalHeight":417}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":4,"links":{"entries":[{"url":"https://www.linkedin.com/in/kodiane/","alts":[],"httpStatus":999},{"url":"https://github.com/react-dates","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-dates/stargazers","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-dates/labels/pull%20request%20wanted","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-dates/issues","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-dates/pulls","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/react-dates/network/dependents","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1643064259447},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":45,"sectionCount":1,"readingList":0,"topics":[{"topicId":"55f1c20aba7a","slug":"software-engineering","createdAt":1491949272237,"deletedAt":0,"image":{"id":"1*U8FboK4lz1wqwQC6IcqxKw@2x.jpeg","originalWidth":5507,"originalHeight":3098},"name":"Software Engineering","description":"Back-end to front-end.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Software Engineering News and Articles — Medium","type":"Topic"},{"topicId":"63c6f1f93ee","slug":"javascript","createdAt":1493945704961,"deletedAt":0,"image":{"id":"1*5UyyDJ1ESD11yQNd1UVAaQ@2x.jpeg","originalWidth":5472,"originalHeight":3648},"name":"Javascript","description":"An ode to code.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Javascript News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"the-past-present-and-future-of-react-dates","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"the-past-present-and-future-of-react-dates-b351ab739d3f","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*VymqCVttV2_VOqmmApgakw.jpeg","originalWidth":1440,"originalHeight":960,"isFeatured":true,"alt":"Silhouettes of two people in front of the inside of a large, clear clock overlooking a city."}},{"name":"previewTitle","type":3,"text":"The Past, Present, and Future of react-dates","alignment":1},{"name":"previewSubtitle","type":13,"text":"In 2016, Airbnb released react-dates, a React date picker…","alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":3,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"primaryTopicId":"55f1c20aba7a","isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"a4f1","type":3,"text":"The Past, Present, and Future of react-dates","markups":[]},{"name":"e9d3","type":1,"text":"Diane Ko","markups":[{"type":3,"start":0,"end":8,"href":"https://www.linkedin.com/in/kodiane/","title":"","rel":"","anchorType":0}]},{"name":"0a28","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*VymqCVttV2_VOqmmApgakw.jpeg","originalWidth":1440,"originalHeight":960,"isFeatured":true,"alt":"Silhouettes of two people in front of the inside of a large, clear clock overlooking a city."}},{"name":"2da4","type":1,"text":"In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also tells us that react-dates is used by over 30,000 repos.","markups":[{"type":3,"start":81,"end":123,"href":"https://github.com/airbnb/react-dates/stargazers","title":"","rel":"","anchorType":0},{"type":3,"start":151,"end":191,"href":"https://github.com/airbnb/react-dates/network/dependents","title":"","rel":"","anchorType":0}]},{"name":"ae28","type":1,"text":"In more recent years, Airbnb’s requirements for a date picker have changed in a way that has…","markups":[{"type":3,"start":386,"end":417,"href":"https://github.com/react-dates","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"bf4e","startIndex":0}]},"isFullContent":false,"subtitle":"In 2016, Airbnb released react-dates, a React date picker component library. The project has amassed more than 11,000 stars. GitHub also…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"f6580010ae0c":{"id":"f6580010ae0c","versionId":"268d216778e4","creatorId":"1528225a7d7a","homeCollectionId":"53c7c27702d5","title":"Meet Ottr: A Serverless Public Key Infrastructure Framework","detectedLanguage":"en","latestVersion":"268d216778e4","latestPublishedVersion":"268d216778e4","hasUnpublishedEdits":false,"latestRev":830,"createdAt":1635199796960,"updatedAt":1641321047418,"acceptedAt":0,"firstPublishedAt":1635271758922,"latestPublishedAt":1635274723010,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*6C4m508jFNo-FtFNIK1acw.png","filter":"","backgroundSize":"","originalWidth":900,"originalHeight":388,"strategy":"resample","height":0,"width":0},"wordCount":2836,"imageCount":7,"readingTime":11.751886792452831,"subtitle":"Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":78,"isBookmarked":false,"tags":[{"slug":"security","name":"Security","postCount":124014,"metadata":{"postCount":124014,"coverImage":{"id":"1*BfUEEA3Av51pCGWEs2jtWQ.jpeg","originalWidth":1080,"originalHeight":978}},"type":"Tag"},{"slug":"public-key-infrastructure","name":"Public Key Infrastructure","postCount":133,"metadata":{"postCount":133,"coverImage":{"id":"1*0PKqeI5NHZ0Dq1bgbYAQ6Q.png","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"aws","name":"AWS","postCount":117097,"metadata":{"postCount":117097,"coverImage":{"id":"0*_LuTYPayJUEeOuxZ","originalWidth":3543,"originalHeight":2365,"unsplashPhotoId":"OqtafYT5kTw"}},"type":"Tag"},{"slug":"open-source","name":"Open Source","postCount":51097,"metadata":{"postCount":51097,"coverImage":{"id":"0*mX0G8t5NkoTwTSHq.jpg","originalWidth":800,"originalHeight":450,"isFeatured":true}},"type":"Tag"},{"slug":"airbnb","name":"Airbnb","postCount":12702,"metadata":{"postCount":12702,"coverImage":{"id":"1*TYjxEMGg_1DHbwUuZdkbHQ.jpeg","originalWidth":1200,"originalHeight":800,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://cloudflare-dns.com","alts":[],"httpStatus":200},{"url":"https://letsencrypt.org/","alts":[],"httpStatus":200},{"url":"https://www.abetterinternet.org/","alts":[],"httpStatus":200},{"url":"https://letsencrypt.org/how-it-works/","alts":[],"httpStatus":200},{"url":"https://letsencrypt.org/certificates/","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/kenneyan/","alts":[],"httpStatus":999},{"url":"https://acme-v02.api.letsencrypt.org","alts":[],"httpStatus":200},{"url":"https://acme-staging-v02.api.letsencrypt.org","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/ottr","alts":[],"httpStatus":200},{"url":"https://github.com/airbnb/ottr/tree/master/docs/CONTRIBUTE.md","alts":[],"httpStatus":200},{"url":"https://www.airbnb.com/careers/departments/engineering","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1635274723992},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":368,"sectionCount":1,"readingList":0,"topics":[{"topicId":"55f1c20aba7a","slug":"software-engineering","createdAt":1491949272237,"deletedAt":0,"image":{"id":"1*U8FboK4lz1wqwQC6IcqxKw@2x.jpeg","originalWidth":5507,"originalHeight":3098},"name":"Software Engineering","description":"Back-end to front-end.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Software Engineering News and Articles — Medium","type":"Topic"},{"topicId":"d4e7f4144ac5","slug":"cybersecurity","createdAt":1493946839810,"deletedAt":0,"image":{"id":"1*JpJUz3WBPiQG5vkJ9WY8rw@2x.jpeg","originalWidth":6000,"originalHeight":4000},"name":"Cybersecurity","description":"Towards a more perfect password.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Cybersecurity News and Articles — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"meet-ottr-a-serverless-public-key-infrastructure-framework","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"meet-ottr-a-serverless-public-key-infrastructure-framework-f6580010ae0c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*6C4m508jFNo-FtFNIK1acw.png","originalWidth":900,"originalHeight":388,"isFeatured":true}},{"name":"f8ee","type":3,"text":"Meet Ottr: A Serverless Public Key Infrastructure Framework","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"53c7c27702d5","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":3,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"primaryTopicId":"55f1c20aba7a","isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"f8ee","type":3,"text":"Meet Ottr: A Serverless Public Key Infrastructure Framework","markups":[]},{"name":"057d","type":1,"text":"Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The purpose of the blog is to provide an overview on Ottr with sample reference architecture, logical and network flows, and highlight the benefits of the solution. For installation instructions, skip…","markups":[{"type":2,"start":0,"end":375}]}],"sections":[{"name":"e284","startIndex":0}]},"isFullContent":false,"subtitle":"Ottr is a serverless Public Key Infrastructure framework that handles end-to-end certificate rotations without the use of an agent. The…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"}}},"paging":{"path":"/_/api/collections/53c7c27702d5/stream","next":{"to":"1731348875417","ignoredIds":["84425d66ee11","d9c4dba859e8","dc169230bd12","d79ae3afa132","b351ab739d3f","f6580010ae0c"],"page":3}},"collection":{"id":"53c7c27702d5","name":"The Airbnb Tech Blog","slug":"airbnb-engineering","tags":["DATA SCIENCE","WEB DEVELOPMENT","OPEN SOURCE","FRONT END DEVELOPMENT","ARTIFICIAL INTELLIGENCE"],"creatorId":"ebe93072cafd","description":"Creative engineers and data scientists building a world where you can belong anywhere. http://airbnb.io","shortDescription":"Creative engineers and data scientists building a world…","image":{"imageId":"1*MlNQKg-sieBGW5prWoe9HQ.jpeg","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":148669,"activeAt":1732130847454},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"1*JZl-TXoSiG0VmYn3qWLdTA.png","filter":"","backgroundSize":"","originalWidth":280,"originalHeight":280,"strategy":"resample","height":0,"width":0},"twitterUsername":"AirbnbEng","facebookPageName":"AirbnbTech","collectionMastheadId":"7e48cc52dce0","sections":[{"type":2,"collectionHeaderMetadata":{"title":"The Airbnb Tech Blog","description":"A deeper look into how our Engineers and Data Scientists build a world of belonging","backgroundImage":{"id":"1*eM5hEN1XX7U9XDPgjcFC8g.png","originalWidth":1520,"originalHeight":492},"logoImage":{"id":"1*5wg57UPTn3EZIWQSgf9mMA@2x.png","originalWidth":566,"originalHeight":584,"alt":"The Airbnb Tech Blog"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":4,"postIds":["b236078ec82b","e470535f76d4","a784b2dbe325","d33ffc4ddb8f"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":6,"postIds":["84425d66ee11","d9c4dba859e8","dc169230bd12","d79ae3afa132","b351ab739d3f","f6580010ae0c"],"tagSlug":"Open Source","tagName":"Open Source","sectionHeader":"Open Source"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"People","tagName":"People","sectionHeader":"People"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"AI","tagName":"AI","sectionHeader":"Artificial Intelligence and Machine Learning"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Data","tagName":"Data","sectionHeader":"Data"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Frontend","tagName":"Frontend","sectionHeader":"Web"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Mobile","tagName":"Mobile","sectionHeader":"Mobile"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Infrastructure","tagName":"Infrastructure","sectionHeader":"Infrastructure"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Fintech","tagName":"Fintech","sectionHeader":"Fintech"}}],"tintColor":"#FF007E82","lightText":false,"favicon":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF30969A","point":0},{"color":"#FF338B8E","point":0.1},{"color":"#FF338083","point":0.2},{"color":"#FF337477","point":0.3},{"color":"#FF31696B","point":0.4},{"color":"#FF2F5D5F","point":0.5},{"color":"#FF2B5153","point":0.6},{"color":"#FF264546","point":0.7},{"color":"#FF203839","point":0.8},{"color":"#FF192B2C","point":0.9},{"color":"#FF101D1D","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF007E82","point":0},{"color":"#FF368D91","point":0.1},{"color":"#FF529C9F","point":0.2},{"color":"#FF6AAAAD","point":0.3},{"color":"#FF80B8BA","point":0.4},{"color":"#FF95C5C7","point":0.5},{"color":"#FFA9D2D4","point":0.6},{"color":"#FFBDDFE0","point":0.7},{"color":"#FFCFEBEC","point":0.8},{"color":"#FFE2F7F7","point":0.9},{"color":"#FFF4FFFF","point":1}],"backgroundColor":"#FF007E82"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F7F8","point":0},{"color":"#FFDFF6F7","point":0.1},{"color":"#FFDAF6F6","point":0.2},{"color":"#FFD5F5F6","point":0.3},{"color":"#FFCFF4F5","point":0.4},{"color":"#FFC9F3F4","point":0.5},{"color":"#FFC3F2F4","point":0.6},{"color":"#FFBDF1F3","point":0.7},{"color":"#FFB7F0F3","point":0.8},{"color":"#FFB1F0F2","point":0.9},{"color":"#FFAAEFF1","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4EAEB2","point":0},{"color":"#FF62B6B9","point":0.1},{"color":"#FF73BDC0","point":0.2},{"color":"#FF84C4C7","point":0.3},{"color":"#FF93CBCD","point":0.4},{"color":"#FFA1D2D3","point":0.5},{"color":"#FFAFD8DA","point":0.6},{"color":"#FFBDDFE0","point":0.7},{"color":"#FFCAE5E6","point":0.8},{"color":"#FFD7ECEC","point":0.9},{"color":"#FFE3F2F2","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":4,"title":"Data","url":"https://medium.com/airbnb-engineering/data/home","topicId":"23a094f20d66","source":"topicId"},{"type":4,"title":"AI & ML","url":"https://medium.com/airbnb-engineering/ai/home","topicId":"fa81dc8a53b3","source":"topicId"},{"type":1,"title":"Mobile","tagSlug":"mobile","url":"https://medium.com/airbnb-engineering/tagged/mobile","source":"tagSlug"},{"type":4,"title":"Web","url":"https://medium.com/airbnb-engineering/web/home","topicId":"1a5b002f7f36","source":"topicId"},{"type":4,"title":"Infrastructure","url":"https://medium.com/airbnb-engineering/airbnb-engineering-infrastructure/home","topicId":"439dc2e252ab","source":"topicId"},{"type":4,"title":"Open Source","url":"https://medium.com/airbnb-engineering/open-source/home","topicId":"3cb92d13faa8","source":"topicId"},{"type":4,"title":"People","url":"https://medium.com/airbnb-engineering/medium-com-airbnb-engineering-people/home","topicId":"b380931c02f5","source":"topicId"},{"type":3,"title":"Careers","url":"https://careers.airbnb.com/"}],"colorBehavior":1,"collectionFeatures":[25],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"title":"The Airbnb Tech Blog","description":"A deeper look into how our Engineers and Data Scientists build a world of belonging","backgroundImage":{"id":"1*eM5hEN1XX7U9XDPgjcFC8g.png","originalWidth":1520,"originalHeight":492},"logoImage":{"id":"1*5wg57UPTn3EZIWQSgf9mMA@2x.png","originalWidth":566,"originalHeight":584,"alt":"The Airbnb Tech Blog"},"alignment":2,"layout":5},"subscriberCount":148669,"tagline":"Creative engineers and data scientists building a world…","isOptedIntoAurora":false,"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092925180,"type":"Collection"},"header":{"title":"The Airbnb Tech Blog","description":"A deeper look into how our Engineers and Data Scientists build a world of belonging","backgroundImage":{"id":"1*eM5hEN1XX7U9XDPgjcFC8g.png","originalWidth":1520,"originalHeight":492},"logoImage":{"id":"1*5wg57UPTn3EZIWQSgf9mMA@2x.png","originalWidth":566,"originalHeight":584,"alt":"The Airbnb Tech Blog"},"alignment":2,"layout":5},"streamItems":[{"createdAt":1732405972935,"randomId":"2defc157b847","section":{"items":[{"post":{"postId":"b236078ec82b"},"itemType":"post"},{"post":{"postId":"e470535f76d4"},"itemType":"post"},{"post":{"postId":"a784b2dbe325"},"itemType":"post"},{"post":{"postId":"d33ffc4ddb8f"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"},{"createdAt":1732405972935,"randomId":"538b8eb9616f","section":{"items":[{"post":{"postId":"84425d66ee11"},"itemType":"post"},{"post":{"postId":"d9c4dba859e8"},"itemType":"post"},{"post":{"postId":"dc169230bd12"},"itemType":"post"},{"post":{"postId":"d79ae3afa132"},"itemType":"post"},{"post":{"postId":"b351ab739d3f"},"itemType":"post"},{"post":{"postId":"f6580010ae0c"},"itemType":"post"}],"layout":4,"heading":{"fallbackTitle":"Open Source","headingBasic":{"title":"Open Source"},"headingType":"headingBasic"}},"itemType":"section","type":"StreamItem"}]}) // ]]></script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8e7513510ac29c6e',t:'MTczMjQwNTk3My4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>