1<!DOCTYPE html> 2 3 4 5 6 7 8 9 10 11 12<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 13 <head> 14 <!-- Google Optimize Anti-flicker snippet (recommended) --> 15 <style>.async-hide { opacity: 0 !important} </style> 16 <style>.promo{background:#222528;position:fixed;z-index:1001!important;left:0;top:0;right:0;max-height:48px;min-height:48px;padding-top:0!important;padding-bottom:0!important}.promo,.promo p{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo p{font-size:.8125rem;line-height:1rem;color:#fff;margin-bottom:0;margin-top:0;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700}@media only screen and (max-width:650px){.promo p{font-size:.6875rem}}.promo span{overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.promo a{color:#fff!important;text-decoration:underline!important}.promo a.btn{background:#d0021b;padding:7px 20px;text-decoration:none!important;font-weight:700;margin-left:10px;margin-right:10px;white-space:nowrap;border-radius:5px}@media only screen and (max-width:650px){.promo a.btn{font-size:.6875rem;padding:7px 10px}}.promo.container{padding-top:8px;padding-bottom:8px}@media only screen and (min-width:1050px){.promo.container{padding-top:0;padding-bottom:0}}.promo .actions{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.promo .actions__left{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo .actions__right{-ms-flex-preferred-size:40px;flex-basis:40px;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.promo.hidden{display:none}.promo.show{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.promo.show .container__inner{-webkit-box-flex:1;-ms-flex:1;flex:1}.promo.fixed{position:fixed}.promo.show+header.header{margin-top:48px}.header{background:#fff;-webkit-box-shadow:0 1px 0 #dde2e5;box-shadow:0 1px 0 #dde2e5}.header .actions__left,.header__bottom__events{max-width:100%!important;margin:0}.header .header__events-all{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.header .header__events-all .header__event-slot{-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;border-right:1px solid #dde2e5;margin-top:3px;margin-bottom:3px;padding-left:15px;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:5px;min-width:300px}.header .header__events-all .header__event-slot:hover{text-decoration:none!important}.header .header__events-all .header__event-slot img{min-width:40px;height:40px}.header .header__events-all .header__event-slot div{margin-left:10px}.header .header__events-all .header__event-slot span{font-weight:700!important;font-size:.75rem;margin-bottom:0!important;margin-top:0;display:block;line-height:1.125rem;text-align:left}.header .header__events-all .header__event-slot p{font-weight:400;font-size:.625rem;line-height:130%!important;color:#495057!important;margin:0}@media only screen and (min-width:1050px){.header .header__events-all .header__event-slot p{font-size:.625rem}}.header .header__events-all .header__event-slot:first-child{padding-left:0}.header .header__events-all .header__event-slot:last-child{padding-right:0;border-right:0}@media only screen and (min-width:1050px){.header__bottom,.header__middle,.header__top{position:relative;white-space:nowrap}}.header__top{padding:10px 0}@media only screen and (min-width:800px){.header__top{padding:5px 0}}.header__bottom{padding:5px 0;z-index:29;max-width:100%}.header__bottom a{font-size:.8125rem}.header__bottom .trending{margin-left:0;margin-right:0}.header__bottom .actions{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.header__bottom .actions__left{max-width:calc(100% + 8px)}@media only screen and (min-width:800px){.header__bottom .actions__left{max-width:calc(100% + 24px)}}.header__bottom .actions__right{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:none}@media only screen and (min-width:1050px){.header__bottom .actions__right{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__middle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header__middle{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.header__top .actions__left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}@media only screen and (min-width:1050px){.header__top .actions__right{max-width:430px}}.no-style.header__nav li:nth-child(3){font-weight:700}.no-style.header__nav li:nth-child(3) a{color:#0e5ef1!important}.header__bottom__events::after{background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),to(#fff));background:linear-gradient(90deg,rgba(255,255,255,0) 0,#fff 100%);content:'';position:absolute;height:60px;right:10px;width:25px}@media only screen and (min-width:1050px){.header__bottom__events::after{display:none}}.contribute-link{font-weight:400;font-size:.6875rem;color:#000!important;position:relative;padding-left:10px}.contribute-link:hover{color:#00791d!important;text-decoration:none!important}.contribute-link::before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1);left:-1px}.my-0{margin-top:0!important;margin-bottom:0!important}.header__desc.my-0{margin-left:0}.header__bottom__events .actions__left{max-width:100%!important;overflow-x:scroll;-ms-overflow-style:none;scrollbar-width:none;display:block;scroll-behavior:smooth;min-width:100%}.header__bottom__events .actions__left::-webkit-scrollbar{display:none}.header__bottom__events .actions__left:-webkit-scrollbar-thumb{background:#fff}.logo{line-height:1rem}.header{position:relative;z-index:41;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.header .input:focus,.header input[type=password]:focus,.header input[type=text]:focus{border:1px solid #00791d}.header a:not(.button):not(.login__action):not(.active){text-decoration:none;color:#222}.header a:not(.button):not(.login__action):not(.active):hover{text-decoration:underline;color:#222}.header__items{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (min-width:1050px){.header__items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.header__items nav{position:relative;background:0 0;padding:0;left:0;top:0;line-height:inherit;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100%;max-height:80px}}.header__items>div{width:100%;margin-bottom:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column nowrap;flex-flow:column nowrap}@media only screen and (min-width:552px){.header__items>div:not(:nth-last-child(-n+2)){margin-bottom:32px}}@media only screen and (min-width:552px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/2 - (32px - 32px * 1/2));flex-basis:calc(99.7% * 1/2 - (32px - 32px * 1/2));max-width:calc(99.7% * 1/2 - (32px - 32px * 1/2));width:calc(99.7% * 1/2 - (32px - 32px * 1/2))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(2n){margin-right:0;margin-left:auto}}@media only screen and (min-width:800px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/4 - (32px - 32px * 1/4));flex-basis:calc(99.7% * 1/4 - (32px - 32px * 1/4));max-width:calc(99.7% * 1/4 - (32px - 32px * 1/4));width:calc(99.7% * 1/4 - (32px - 32px * 1/4))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(4n){margin-right:0;margin-left:auto}}@media only screen and (min-width:1050px){.header__items>div{margin-bottom:0!important;margin-right:0!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.header__items .language__switcher{display:none}.header__items .language__switcher .li-nav.active>a,.header__items .language__switcher>li.active>a{color:#fff!important}.header__items .language__switcher .li-nav.active>a:hover,.header__items .language__switcher>li.active>a:hover{color:#fff!important;background:#0e5ef1}.header__items .language__switcher .li-nav:hover>a,.header__items .language__switcher>li:hover>a{color:#fff}.header+main{display:block;min-height:210px;-webkit-transition:margin .15s ease;transition:margin .15s ease;margin-top:0!important}.header--hide .header+main{margin-top:50px}.header--hide .header__toggle{opacity:0;top:20px;visibility:hidden}.header--hide .header__logo{max-height:0}.header--hide .header__middle,.header--hide .header__top{max-height:0;overflow:hidden;padding-top:0;padding-bottom:0;border-color:transparent}.header--hide .header__bottom .vue-portal-target{top:3px;right:0;bottom:auto;left:auto;position:absolute}.header__middle,.header__top{-webkit-transition:all .15s ease;transition:all .15s ease}.header__middle{border-bottom:1px solid rgba(0,0,0,.1);z-index:33}.header__middle .vue-portal-target{width:100%}@media only screen and (min-width:1050px){.header__middle .vue-portal-target{display:none}}@media only screen and (min-width:1050px){.header__middle{line-height:5.75rem;text-align:left;padding:0;z-index:30}.header__middle .widget__heading{display:none}}.header__top>.actions__left{display:none}@media only screen and (min-width:1050px){.header__top>.actions__left{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__top>.actions__right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:0;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.header__top>.actions__right .dropdown__holder{width:calc(100vw - 16px);max-height:80vh}@media only screen and (min-width:600px){.header__top>.actions__right .dropdown__holder{width:auto}}.header__top>.actions__right>*{margin:0}.header__top>.actions__right .search{display:none}@media only screen and (min-width:1050px){.header__top>.actions__right>*{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}.header__top>.actions__right .search{display:block}}.header__top .user__login{display:block}.header__top .user__login>.button,.header__top .user__login>button{border-top-right-radius:0;border-bottom-right-radius:0}@media only screen and (min-width:1050px){.header__top{position:relative;right:auto;width:100%}}.header__logo{max-width:165px;position:absolute;top:8px;overflow:hidden;-webkit-transition:all .1s ease;transition:all .1s ease;z-index:32;line-height:2.25rem;height:36px;width:100px;margin-left:50px;-ms-flex-preferred-size:190px;flex-basis:190px}@media only screen and (min-width:800px){.header__logo{top:4px}}@media only screen and (min-width:1050px){.header__logo{position:relative;top:0;overflow:visible;margin-right:20px;margin-left:0;line-height:3.125rem;height:50px}.header__logo>*{width:165px}}@media only screen and (min-width:1280px){.header__logo{margin-right:30px}}.header__desc,.header__more>button{text-transform:capitalize;color:#666;letter-spacing:0;font-size:0;font-weight:400;line-height:1.5rem;vertical-align:top;font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Variable","Segoe UI",system-ui,ui-sans-serif,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-transition:font-size .15s ease-in-out;transition:font-size .15s ease-in-out}@media only screen and (min-width:1050px){.header__desc,.header__more>button{font-size:.6875rem}}.header__desc{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;width:auto}.header__topics{white-space:nowrap;float:right;position:relative}.header__topics *{display:inline-block;vertical-align:top}.header__topics a{font-size:.8125rem}@media only screen and (min-width:1050px){.header__topics{float:none}}.header__more{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top}.header__more:before{left:-12px}.header__more:after,.header__more:before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1)}.header__more:after{right:-12px}.header__more:hover{cursor:pointer;color:rgba(0,0,0,.75)}.header__user{display:inline-block;vertical-align:top;white-space:nowrap;margin-left:8px}@media only screen and (min-width:1050px){.header__user{margin-left:0}}.header__user>div{display:inline-block;vertical-align:top}.header__user-nav a:not(.button){text-transform:uppercase;font-size:.75rem;font-weight:600}.header__user-nav a:not(.button):not(.active){opacity:.5}.header__user-nav a:not(.button):not(.active):hover{opacity:.75}.header__user-nav a:not(.button):hover{text-decoration:none}.header__user-nav a:not(.button).active{color:#222;cursor:default;text-decoration:none}.header__user-nav a:not(.button):before{margin-right:0}.header__user-nav a:not(.button):not(:last-child){margin-right:16px}@media only screen and (min-width:1050px){.header__user-nav a:not(.button):not(:last-child){margin-right:32px}}@media only screen and (min-width:1050px){.header__user-nav+.header__topics{margin-left:56px}}.header__search{display:none;vertical-align:top;margin-right:0}@media only screen and (min-width:1050px){.header__search{display:inline-block}}.header__search,.header__user{line-height:inherit}.header__nav{border-bottom:1px solid rgba(0,0,0,.1)}@media only screen and (min-width:800px){.header__nav{border-bottom:0}}.header__nav .button{margin-left:0}.header__nav .button__more{margin-right:20px}.header__nav .li-nav,.header__nav>li{-webkit-transition:all .15s ease;transition:all .15s ease}@media only screen and (min-width:1050px){.header__nav .li-nav,.header__nav>li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;position:static;border:none;min-height:65px}.header__nav .li-nav:hover.has--subnav .nav .li-nav,.header__nav .li-nav:hover.has--subnav .nav>
16li,.header__nav>li:hover.has--subnav .nav .li-nav,.header__nav>li:hover.has--subnav .nav>li{white-space:normal}.header__nav .li-nav:hover.has--subnav .nav__subnav,.header__nav>li:hover.has--subnav .nav__subnav{opacity:1;top:100%;visibility:visible;-webkit-transition-delay:.25s;transition-delay:.25s}.header__nav .li-nav:hover.has--subnav .nav__category,.header__nav>li:hover.has--subnav .nav__category{width:100%}.header__nav .li-nav:hover.has--subnav .nav__category:after,.header__nav .li-nav:hover.has--subnav .nav__category:before,.header__nav>li:hover.has--subnav .nav__category:after,.header__nav>li:hover.has--subnav .nav__category:before{-webkit-transition-delay:.25s;transition-delay:.25s;opacity:1}}@media only screen and (min-width:1080px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1280px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1338px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}.header__nav .li-nav>a,.header__nav>li>a{font-size:.875rem;line-height:1.5rem;padding:12px 0;color:#000;display:inline-block;max-width:100%;position:relative;z-index:61;white-space:normal}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{padding:8px 0 0;font-weight:700}}.header__nav .li-nav>a:after,.header__nav .li-nav>a:before,.header__nav>li>a:after,.header__nav>li>a:before{content:'';position:absolute;bottom:-1px;left:50%;width:0;height:0;opacity:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-style:solid;border-width:0 5px 5px 5px;-webkit-transition:opacity .15s ease-in-out;transition:opacity .15s ease-in-out;border-color:transparent transparent #fff transparent}.header__nav .li-nav>a:before,.header__nav>li>a:before{left:50%;bottom:0;border-width:0 6px 6px 6px;border-color:transparent transparent #f5f7f8 transparent}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1rem}}@media only screen and (min-width:1800px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1.125rem}}.header--open{overflow:hidden}@media only screen and (min-width:600px){.header--open{overflow:visible}}.header--open .content-items{max-height:215px;margin:12px 0 24px}.header--open .search{margin-top:16px;display:block}.header--open .header__toggle:before{z-index:10}.header--open .header__toggle>span:nth-child(1){top:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header--open .header__toggle>span:nth-child(2){opacity:0}.header--open .header__toggle>span:nth-child(3){top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header--open .header__items,.header--open .header__items .language__switcher{display:-webkit-box;display:-ms-flexbox;display:flex}.header--open .header__top{z-index:100;position:absolute;left:0;right:8px;background:#fff}@media only screen and (min-width:800px){.header--open .header__top{right:20px}}.header--open .header__top .search{display:none}.header--open .header__logo{z-index:101}.header--open .header__middle{padding-top:60px}.header--open .header__bottom{display:none}.header--open .header__container{max-height:90vh;overflow-x:hidden;overflow-y:auto}@media only screen and (min-width:1050px){.header--open .header__container{overflow:visible}}.header .subnav{position:absolute;-webkit-box-shadow:0 5px 25px 1px rgba(0,0,0,.15);box-shadow:0 5px 25px 1px rgba(0,0,0,.15);background:#fff;visibility:hidden;line-height:1.75rem;max-width:100%;width:100%;left:0;opacity:0;overflow:hidden;border:1px solid #f5f7f8;border-radius:2px;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;top:105%;z-index:60;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.header .subnav .subnav__categories{-webkit-box-flex:0;-ms-flex:0 1 280px;flex:0 1 280px;padding:24px 0;background:#f5f7f8;margin-right:0!important}.header .subnav .subnav__categories>li{display:block;font-size:.9375rem;padding:2px 48px 2px 24px}.header .subnav .subnav__categories>li a{display:block;font-weight:700}.header .subnav .subnav__categories>li:hover{background:#e1e1e1}.header .subnav .subnav__heading{margin-bottom:20px}.header .subnav .subnav__content{position:relative;-ms-flex-item-align:start;align-self:flex-start;padding:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header .subnav .subnav__content{padding-left:32px;padding-right:32px;margin:0 auto;-webkit-box-flex:1;-ms-flex:1 1 600px;flex:1 1 600px}}.header .subnav .subnav__content .heading__container{-ms-flex-preferred-size:100%;flex-basis:100%}.header .subnav .subnav__content:before{content:'';position:absolute;
16left:0;top:0;bottom:-100%;width:1px;background:rgba(0,0,0,.1)}.languagesEdition .active{font-weight:700}.header__more.dropdown:after{content:'';display:inline-block;vertical-align:middle;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;background-repeat:no-repeat;background-position:center;margin-bottom:2px;width:7px;height:7px;-webkit-transition:-webkit-transform .15s ease;transition:-webkit-transform .15s ease;transition:transform .15s ease;transition:transform .15s ease,-webkit-transform .15s ease;background-color:#fff!important;background-size:contain}.header__more.dropdown button{color:#000!important;margin-right:-20px;padding-right:20px;z-index:1000}.header__more.dropdown .dropdown__holder{width:165px}.header__more.dropdown .dropdown__content{padding:13px;padding-top:5px;padding-bottom:5px}.header__more.dropdown .languagesEdition li{border-bottom:1px solid #e6e6e6}.header__more.dropdown .languagesEdition li:last-child{border:0}.logo__data{display:none;color:#666;font-size:.6875rem}@media only screen and (min-width:1050px){.logo__data{display:block;line-height:.8125rem}}.container{padding-left:12px;padding-right:12px;margin:0 auto;min-width:320px;-webkit-transition:padding .15s ease-in-out;transition:padding .15s ease-in-out}@media only screen and (min-width:600px){.container{padding-left:16px;padding-right:16px}}@media only screen and (min-width:800px){.container{padding-left:20px;padding-right:20px}}@media only screen and (min-width:1250px){.container{padding-left:60px;padding-right:60px}}@media only screen and (min-width:1400px){.container{padding-left:20px;padding-right:20px}}.container.white{background:#fff}.container__inner{max-width:1290px;margin:0 auto;-webkit-transition:max-width .15s ease-out;transition:max-width .15s ease-out}.search{display:block;position:relative;z-index:33;width:100%;max-width:100%;margin:0}.search:before{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:0;z-index:34}.search__bar{display:block;border-radius:2px;position:relative;z-index:33}.search__bar #search{margin-bottom:0;max-width:100%;background:#fff}.search__go{top:50%;right:0;bottom:0;left:auto;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:32;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:36px;height:36px;line-height:2.25rem;-webkit-box-shadow:none;box-shadow:none;display:block;background:0 0;border:0;font-size:0}@media only screen and (min-width:600px){.search__go{z-index:35}}.header #search,.search__go:hover{cursor:pointer}.header #search{height:36px;position:relative;max-width:100%;background-color:#f5f7f8!important}@media only screen and (min-width:600px){.header #search{font-size:.8125rem;min-width:165px;max-width:100%;opacity:1}}.header #search:hover{cursor:auto}@media only screen and (min-width:1050px){.header #search{margin-left:auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.header #search:focus{min-width:215px}}.header #search:focus{cursor:auto}.header #search .field__desc{display:none}.header #searchForm{width:100%;margin-top:8px}.header #searchForm:before{right:8px}@media only screen and (min-width:600px){.header #searchForm{margin-top:16px}}@media only screen and (min-width:1050px){.header #searchForm{margin-top:0}}</style> 17
17<script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date; 18 h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')}; 19 (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c; 20 })(window,document.documentElement,'async-hide','dataLayer',4000, 21 {'GTM-W9GJ5DL':true});</script>
21 22 23
23<script type="text/javascript"> 24 25 var loggedIn = false; 26 if (loggedIn) { 27 var userCountryId = ''; 28 } 29 </script>
29 30 31 32 33 34 35 36
37<script> 38 window.dataLayer = window.dataLayer || []; 39 function gtag(){dataLayer.push(arguments);} 40 41 //CookieControl tool recomendation 42 // Call the default command before gtag.js or Tag Manager runs to 43 // adjust how the tags operate when they run. Modify the defaults 44 // per your business requirements and prior consent granted/denied, e.g.: 45 gtag('consent', 'default', { 46 'ad_storage': 'denied', 47 'ad_user_data': 'denied', 48 'ad_personalization': 'denied', 49 'analytics_storage': 'denied', 50 wait_for_update: 500 51 }); 52 gtag('set', 'ads_data_redaction', true); 53 gtag('set', 'url_passthrough', true); 54 55 if((typeof loggedIn != "undefined") && loggedIn){ 56 window.dataLayer.push({'logged_in': 'true'}); 57 } else { 58 window.dataLayer.push({'logged_in': 'false'}); 59 } 60 61 window.dataLayer.push({'show_queryz': ''}); 62 63 gtag('config', 'G-VMVPD4D2JY'); 64</script>
64 65 66<!-- Google Tag Manager -->
67<script> 68var gtmProfile="GTM-W9GJ5DL"; 69(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 70new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 71j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 72'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 73})(window,document,'script','dataLayer', gtmProfile);</script>
73 74<!-- End Google Tag Manager --> 75 76 <title>Airbnb Cuts Authentication Code by 60% with Server Driven Architecture - InfoQ</title> 77 <link rel="canonical" href="https://www.infoq.com/news/2026/09/airbnb-server-driven-login/"/> 78 <link rel="alternate" href="https://www.infoq.com/news/2026/09/airbnb-server-driven-login/" hreflang="en"/> 79 80 81 82 83 84 85 86 87 88 89 90 91 92 <link rel="alternate" href="https://www.infoq.com/news/2026/09/airbnb-server-driven-login/" hreflang="x-default" /> 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110<meta http-equiv="pragma" content="no-cache" /> 111<meta http-equiv="cache-control" content="private,no-cache,no-store,must-revalidate" /> 112<meta http-equiv="expires" content="0" /> 113<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 114<meta name="copyright" content="© 2006 C4Media" /> 115 116<meta name="google-site-verification" content="0qInQx_1WYOeIIbxnh7DnXlw1XOxNgAYakO2k4GhNnY" /> 117<meta name="msapplication-TileColor" content="#ffffff"/> 118<meta name="msapplication-TileImage" content="/styles/static/images/logo/logo.jpg"/> 119<meta property="wb:webmaster" content="3eac1729a8bbe046" /> 120<meta content="width=device-width,initial-scale=1" name="viewport"> 121<meta http-equiv="X-UA-Compatible" content="IE=10, IE=edge"> 122 123 124 <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/style.css"/> 125 <link rel="stylesheet" type="text/css" media="print" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/print.css"/> 126 <link rel="preload" type="text/css" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/style_en.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 127 <link rel="preload" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/icons.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 128 <link rel="preload" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/style_extra.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 129 <noscript> 130 <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/style_en.css"/> 131 <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/icons.css"> 132 <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/style_extra.css"/> 133 </noscript> 134 135 <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/fonts/font.css"/> 136 137 <link rel="shortcut icon" href="https://cdn.infoq.com/statics_s1_20260930115701/favicon.ico" type="image/x-icon" /> 138 <link rel="apple-touch-icon" href="https://cdn.infoq.com/statics_s1_20260930115701/apple-touch-icon.png"/> 139 140
140<script type="text/javascript"> 141 var device='desktop'; 142 var InfoQConstants = {}; 143 InfoQConstants.language = 'en'; 144 InfoQConstants.countryCode = ''; 145 146 InfoQConstants.pageUrl = (typeof window.location != 'undefined' && window.location && typeof window.location.href != 'undefined' && window.location.href) ? window.location.href : "URL_UNAVAILABLE"; 147 InfoQConstants.cet='EHpIzrADJYuZGDbo'; 148 InfoQConstants.userDetectedCountryCode = ''; 149 InfoQConstants.bpadb = 'hzCRIMKLcabgact4XhmI'; 150 </script>
150 151 152
152<script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260930115701/scripts/combinedJs.min.js"></script>
152 153
153<script type="text/javascript"> 154 155 var JSi18n = JSi18n || {}; // define only if not already defined 156 JSi18n.error='Error'; 157 JSi18n.login_unverifiedAccount='Unverified account'; 158 JSi18n.contentSummary_showPresentations_1=''; 159 JSi18n.contentSummary_showPresentations_2=''; 160 JSi18n.contentSummary_showPresentations_3=''; 161 JSi18n.contentSummary_showInterviews_1=''; 162 JSi18n.contentSummary_showInterviews_2=''; 163 JSi18n.contentSummary_showInterviews_3=''; 164 JSi18n.contentSummary_showMinibooks_1=''; 165 JSi18n.contentSummary_showMinibooks_2=''; 166 JSi18n.login_sendingRequest='Sending request ...'; 167 JSi18n.bookmark_saved='<q> Saved </q>'; 168 JSi18n.bookmark_error='<q style=color:black;> Error </q>'; 169 JSi18n.categoryManagement_showpopup_viewAllLink_viewAllPrefix='View All'; 170 JSi18n.categoryManagement_showpopup_viewAllLink_viewAllSuffix=''; 171 JSi18n.categoryManagement_showpopup_includeExcludeLink_Exclude='Exclude'; 172 JSi18n.categoryManagement_showpopup_includeExcludeLink_Include='Include'; 173 JSi18n.login_invalid_email='Please specify a valid email'; 174 JSi18n.login_email_not_found = 'No user found with that email'; 175 JSi18n.content_datetime_format='MMM dd, yyyy'; 176 177 // used by frontend 178 JSi18n.FE = { 179 labels: { 180 follow: "Follow", 181 followTopic: "Follow Topic", 182 unfollow: "Unfollow", 183 unfollowTopic: "Unfollow Topic", 184 following: "Following", 185 followers: "Followers", 186 like: "Like", 187 liked: "Liked", 188 authors: "Peers", 189 users : "Users", 190 topics: "Topics", 191 hide: "Hide Item", 192 hidden: "%s was hidden on your profile page.", 193 undo: "Undo", 194 showLess: "Show less", 195 showMore: "Show more", 196 moreAuthors: "And %s more", 197 bookmarked: "Content Bookmarked", 198 unbookmarked: "Content Unbookmarked", 199 characterLimit: "Characters Remaining" 200 } 201 } 202 203 204 205 206 207 var usersInPage = JSON.parse('[{\"id\":\"62671158\",\"ref\":\"author-Monica-Beckwith\",\"url\":\"\/profile\/Monica-Beckwith\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Monica Beckwith\",\"bio\":\"Java Champion, Monica Beckwith is a Java performance engineer. She currently works on improving OpenJDK's HotSpot VM at Microsoft. Her past experiences include working with Arm, Oracle\/Sun and AMD; optimizing the JVM for server class systems. Monica was voted a JavaOne Rock Star speaker and was the performance lead for Garbage First Garbage Collector (G1 GC). You can follow Monica on twitter @mon_beck\",\"followers\":1839,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/QhDv7pXEUK1sdLsYArFmnLxecH4rYhAc.jpg\"},{\"id\":\"45723890\",\"ref\":\"author-Rags-Srinivas\",\"url\":\"\/profile\/Rags-Srinivas\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Rags Srinivas\",\"bio\":\"Raghavan "Rags" Srinivas (@ragss) works as an Architect\/Developer Evangelist goaled with helping developers build highly scalable and available systems. As an OpenStack advocate and solutions architect at Rackspace he was constantly challenged from low level infrastructure to high level application issues. His general focus area is in distributed systems, with a specialization in Cloud Computing and Big Data. He worked on Hadoop, HBase and NoSQL during its early stages. He has spoken on a variety of technical topics at conferences around the world, written for developer portals, conducted and organized Hands-on Labs and taught graduate and online classes in the evening. Rags brings with him over 25 years of hands-on software development and over 15 years of architecture and technology evangelism experience. He has evangelized and influenced the architecture of a number of emerging technology areas. He is also a repeat JavaOne rock star speaker award winner. Rags holds a Masters degree in Computer Science from the Center of Advanced Computer Studies at the University of Louisiana at Lafayette. He likes to hike, run and generally be outdoors but most of all loves to eat.\",\"followers\":360,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/t4nyfgw1THkp4wMZ9EZ59RGJx8Hf9Rk8.jpg\"},{\"id\":\"126665386\",\"ref\":\"author-Leela-Kumili\",\"url\":\"\/profile\/Leela-Kumili\",\"followedByCurrentUser\":false,\"minibio\":\"Lead Engineer\",\"name\":\"Leela Kumili\",\"bio\":\"Leela is a Lead Software Engineer at Starbucks with deep expertise in building scalable, cloud-native systems and distributed platforms. She drives architecture, delivery, and operational excellence across the Rewards Platform, leading efforts to modernize systems, improve scalability, and enhance reliability.\\r\\n\\r\\nIn addition to her technical leadership, Leela serves as an AI Champion for the organization, identifying opportunities to improve developer productivity and workflows using LLM-based tools and establishing best practices for AI adoption. She is passionate about building production-ready systems, enhancing developer experience, and mentoring engineers to grow in both technical and strategic impact. Her interests include platform engineering, distributed systems, developer productivity, and bridging technical solutions with business and product goals.\",\"followers\":84,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/oZlePVmvHTLAVzoapw4QLpkecE5BfJW9.jpeg\"},{\"id\":\"87551248\",\"ref\":\"author-Steef~Jan-Wiggers\",\"url\":\"\/profile\/Steef~Jan-Wiggers\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Queue Lead Editor | Domain Architect | Cloud Expert\",\"name\":\"Steef-Jan Wiggers\",\"bio\":\"Steef-Jan Wiggers is one of InfoQ's senior cloud editors and works as a Domain Architect at VGZ in the Netherlands. His current technical expertise focuses on implementing integration platforms, Azure DevOps, AI, and Azure Platform Solution Architectures. Steef-Jan is a regular speaker at conferences and user groups and writes for InfoQ. Furthermore, Microsoft has recognized him as a Microsoft Azure MVP for the past sixteen years.\",\"followers\":906,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/BhZx03k3Hj0pZVXmTzGqItwZxtJ06o
207Ib.jpg\"},{\"id\":\"80977916\",\"ref\":\"author-Thomas-Betts\",\"url\":\"\/profile\/Thomas-Betts\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Laureate Application Architect at Blackbaud\",\"name\":\"Thomas Betts\",\"bio\":\"Thomas Betts is the former Lead Editor for Architecture and Design at InfoQ, a co-host of the InfoQ Podcast, and a Senior Laureate Software Architect at Blackbaud, working on Agents for Good.\\r\\n\\r\\nFor over two decades, his focus has always been on providing software solutions that delight his customers. He has worked in a variety of industries, including social good, retail, finance, health care, defense and travel.\\r\\n\\r\\nThomas lives in Denver with his wife and son, and they love hiking and otherwise exploring beautiful Colorado.\",\"followers\":1180,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/pSqI6HrU3k9rmmVjwS34OHG0bOMYiE6a.jpg\"},{\"id\":\"72028228\",\"ref\":\"author-Sergio-De-Simone\",\"url\":\"\/profile\/Sergio-De-Simone\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Sergio De Simone\",\"bio\":\"<b>Sergio De Simone<\/b> is a software engineer. Sergio has been working as a software engineer for over twenty five years across a range of different projects and companies, including such different work environments as Siemens, HP, and small startups. For the last 10+ years, his focus has been on development for mobile platforms and related technologies. He is currently working for BigML, Inc., where he leads iOS and macOS development.\",\"followers\":783,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/NovciOoQOAYWqYqRQBFo97SuMm0xbUiC.jpg\"},{\"id\":\"126467140\",\"ref\":\"author-Renato-Losio\",\"url\":\"\/profile\/Renato-Losio\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Expert | AWS Data Hero \",\"name\":\"Renato Losio\",\"bio\":\"Renato has extensive experience as a cloud architect, advisor, and cloud services specialist. Currently, he lives in Berlin and works remotely as a principal cloud architect. His primary areas of interest include cloud services and relational databases. He is an editor at InfoQ and a recognized AWS Data Hero. You can connect with him on LinkedIn.\",\"followers\":925,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/ptroF8HdI2vWXm0NDaKeS0JdiPxMOAra.jpg\"},{\"id\":\"126464202\",\"ref\":\"author-Johan-Janssen\",\"url\":\"\/profile\/Johan-Janssen\",\"followedByCurrentUser\":false,\"minibio\":\"Architect at ASML\",\"name\":\"Johan Janssen\",\"bio\":\"Architect at ASML, loves to share knowledge mainly around Java. Spoke at conferences such as Devoxx, Oracle Code One, Devnexus, and many more. Assisted conferences by participating in program committees and invented and organized JVMCON. Received the JavaOne Rock Star and Oracle Code One Star awards. Wrote various articles both for digital and printed media. Maintainer of various Java JDK\/JRE packages for Chocolatey with around 100 thousand downloads a month.\",\"followers\":546,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/Fb4eZ0mtvMf6MhsmBIhsUVueV4xAs2FD.jpg\"},{\"id\":\"39485652\",\"ref\":\"author-Daniel-Bryant\",\"url\":\"\/profile\/Daniel-Bryant\",\"followedByCurrentUser\":false,\"minibio\":\"InfoQ News Manager | Building Platforms at Syntasso\",\"name\":\"Daniel Bryant\",\"bio\":\"Daniel Bryant is the news manager at InfoQ and the emeritus chair of QCon London. He is also a platform engineer and head of product marketing at Syntasso. Daniel's technical expertise focuses on \u2018DevOps\u2019 tooling, cloud\/container platforms, and microservice implementations. He is a long-time coder and Java Champion who has contributed to several open source projects. Daniel also writes for InfoQ, O\u2019Reilly, and The New Stack and regularly presents at international conferences such as KubeCon, QCon, and JavaOne. In his copious amounts of free time, he enjoys running, reading, and travelling.\",\"followers\":2757,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/tSe5dczMaSGtRUm18VkTR2tcF4W3SogA.jpg\"},{\"id\":\"63268344\",\"ref\":\"author-Chris-Swan\",\"url\":\"\/profile\/Chris-Swan\",\"followedByCurrentUser\":false,\"minibio\":\"Engineer, Atsign\",\"name\":\"Chris Swan\",\"bio\":\"Chris Swan is an Engineer at <a href=\\\"https:\/\/atsign.com\\\" rel=\\\"nofollow\\\">Atsign<\/a>, building the atPlatform, a technology that is putting people in control of their data and removing the frictions and surveillance associated with today\u2019s Internet. He was previously a Fellow at DXC Technology where he held various CTO roles. Before that he held CTO and Director of R&D roles at Cohesive Networks, UBS, Capital SCF and Credit Suisse, where he worked on app servers, compute grids, security, mobile, cloud, networking and containers. Chris co-hosts the <a href=\\\"https:\/\/techdebtburn
207down.com\/\\\" rel=\\\"nofollow\\\">Tech Debt Burndown Podcast<\/a> and is a Dart Google Developer Expert (<a href=\\\"https:\/\/developers.google.com\/community\/experts\\\" rel=\\\"nofollow\\\">GDE<\/a>).\",\"followers\":1878,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/8PE76nOujWAoCM8yqLn9Hfv2HqW3VlIP.jpg\"},{\"id\":\"4927376\",\"ref\":\"author-Karsten-Silz\",\"url\":\"\/profile\/Karsten-Silz\",\"followedByCurrentUser\":false,\"minibio\":\"Full-Stack Java Developer\",\"name\":\"Karsten Silz\",\"bio\":\"Karsten Silz has worked as a full-stack Java developer for 26 years in Europe and the US. In 2004, he co-founded a software product start-up in the US. Karsten led product development for 13 years and left after the company was sold successfully. Since 2003, he has also worked as a contractor. He co-founded the SaaS start-up "Your Home in Good Hands" as CTO in the UK in 2020.\",\"followers\":402,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/p6zmOdOcqXiRj09iiZNeDZap7f0IglQW.jpg\"},{\"id\":\"343314\",\"ref\":\"author-Jonathan-Allen\",\"url\":\"\/profile\/Jonathan-Allen\",\"followedByCurrentUser\":false,\"minibio\":\"Software Architect\",\"name\":\"Jonathan Allen\",\"bio\":\"Jonathan Allen got his start working on MIS projects for a health clinic in the late 90's, bringing them up from Access and Excel to an enterprise solution by degrees. After spending five years writing automated trading systems for the financial sector, he became a consultant on a variety of projects including the UI for a robotic warehouse, the middle tier for cancer research software, and the big data needs of a major real estate insurance company. In his free time he enjoys studying and writing about martial arts from the 16th century.\\r\\n\",\"followers\":1837,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/Wk_C09_mzwK23YkTkKMXResJv3LKUN5D.jpg\"},{\"id\":\"114725059\",\"ref\":\"author-Holly-Cummins\",\"url\":\"\/profile\/Holly-Cummins\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Technical Staff Member, IBM\",\"name\":\"Holly Cummins\",\"bio\":\"Holly Cummins is a Senior Principal Software Engineer on the Red Hat Quarkus team. Before joining Red Hat, Holly was a long time IBMer. In her time at IBM, Holly has been a full-stack javascript developer, a WebSphere Liberty build architect, a client-facing consultant, a JVM performance engineer, and an innovation leader. During her time in the IBM Garage, Holly led projects for enormous banks, tiny startups, and everything in between. Holly has used the power of cloud to understand climate risks, count fish, help a blind athlete run ultra-marathons in the desert solo, and invent stories (although not at all the same time). Holly is also a Java Champion, author, and regular keynote speaker. You can follow her on bluesky at @@hollycummins.com or at hollycummins.com.\\r\\n\\r\\n\\r\\nBefore joining IBM, Holly completed a PhD in Quantum Computation.\\r\\n\",\"followers\":624,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260930115701\/images\/profiles\/cRsuGlFgKyGmGfEHvafpMO63CxbrEm22.jpg\"}]'); 208 209 210 211 212 var topicsInPage = JSON.parse('[{\"name\":\".NET Core\",\"id\":\"15683\",\"url\":\"\/Net-Core\",\"followers\":8050,\"followedByCurrentUser\":false},{\"name\":\"Web Applications\",\"id\":\"6280\",\"url\":\"\/Web_Applications\",\"followers\":19,\"followedByCurrentUser\":false},{\"name\":\"Machine Learning\",\"id\":\"5449\",\"url\":\"\/MachineLearning\",\"followers\":14790,\"followedByCurrentUser\":false},{\"name\":\"Software Engineering\",\"id\":\"7051\",\"url\":\"\/sweng\",\"followers\":2,\"followedByCurrentUser\":false},{\"name\":\"User Experience\",\"id\":\"1358\",\"url\":\"\/ux\",\"followers\":133,\"followedByCurrentUser\":false},{\"name\":\"Mobile Apps\",\"id\":\"15696\",\"url\":\"\/Mobile-Apps\",\"followers\":35,\"followedByCurrentUser\":false},{\"name\":\"Rule Engines\",\"id\":\"728\",\"url\":\"\/rule_engines\",\"followers\":0,\"followedByCurrentUser\":false},{\"name\":\"DevOps\",\"id\":\"6043\",\"url\":\"\/Devops\",\"followers\":5145,\"followedByCurrentUser\":false}
212,{\"name\":\"Reactive Programming\",\"id\":\"15453\",\"url\":\"\/reactive-programming\",\"followers\":12461,\"followedByCurrentUser\":false},{\"name\":\"Development\",\"id\":\"6815\",\"url\":\"\/development\",\"followers\":4166,\"followedByCurrentUser\":false},{\"name\":\"Architecture & Design\",\"id\":\"6816\",\"url\":\"\/architecture-design\",\"followers\":10403,\"followedByCurrentUser\":false},{\"name\":\"Culture & Methods\",\"id\":\"6817\",\"url\":\"\/culture-methods\",\"followers\":3999,\"followedByCurrentUser\":false},{\"name\":\"Scalability\",\"id\":\"3686\",\"url\":\"\/scalability\",\"followers\":105,\"followedByCurrentUser\":false},{\"name\":\"Microservices\",\"id\":\"15274\",\"url\":\"\/microservices\",\"followers\":22389,\"followedByCurrentUser\":false},{\"name\":\"policy\",\"id\":\"43\",\"url\":\"\/policy\",\"followers\":1,\"followedByCurrentUser\":false},{\"name\":\"Architecture\",\"id\":\"1389\",\"url\":\"\/architecture\",\"followers\":3369,\"followedByCurrentUser\":false},{\"name\":\"Evolutionary Architecture\",\"id\":\"18414\",\"url\":\"\/evolutionary-architecture\",\"followers\":3,\"followedByCurrentUser\":false},{\"name\":\"Experiment Driven Development\",\"id\":\"5998\",\"url\":\"\/Experiment_Driven_Development\",\"followers\":2,\"followedByCurrentUser\":false},{\"name\":\"GUI\",\"id\":\"1009\",\"url\":\"\/GUI\",\"followers\":0,\"followedByCurrentUser\":false},{\"name\":\"Identity Management\",\"id\":\"3889\",\"url\":\"\/identity_mgmt\",\"followers\":31,\"followedByCurrentUser\":false},{\"name\":\"AI, ML & Data Engineering\",\"id\":\"16690\",\"url\":\"\/ai-ml-data-eng\",\"followers\":6110,\"followedByCurrentUser\":false},{\"name\":\"Mobile Development\",\"id\":\"6516\",\"url\":\"\/Mobile-Development\",\"followers\":60,\"followedByCurrentUser\":false},{\"name\":\"Distributed Systems\",\"id\":\"6137\",\"url\":\"\/Distributed_Systems\",\"followers\":341,\"followedByCurrentUser\":false},{\"name\":\"Java9\",\"id\":\"7097\",\"url\":\"\/Java9\",\"followers\":5562,\"followedByCurrentUser\":false},{\"name\":\"Web\",\"id\":\"7420\",\"url\":\"\/Web_1\",\"followers\":16,\"followedByCurrentUser\":false},{\"name\":\"Authentication\",\"id\":\"5951\",\"url\":\"\/Authentication\",\"followers\":17,\"followedByCurrentUser\":false}]'); 213 214 215 var userContentLikesInPage = []; 216 var userCommentsLikesInPage = []; 217 218 219 var currentUserId = 248328204; 220 </script>
220 221 222 223 224 225 226 227 228 229 230 231 232 233<!-- Latest Version -->
234<script src="https://cc.cdn.civiccomputing.com/9/cookieControl-9.x.min.js" type="text/javascript"></script>
vendor: 2 bytes, line 234
234
235<script> 236 const config = { 237 apiKey: '8910ea974a96ffb6f927952b4ae9b9b0cc3e5973', 238 product: 'PRO_MULTISITE', 239 240 // general settings 241 consentCookieExpiry: 90, 242 encodeCookie: true, 243 sameSiteCookie: true, // if false, cookie set as SameSite=None;secure; 244 sameSiteValue: ';secure', // either 'Strict', 'Lax', or 'None' 245 subDomains: true, 246 initialState: 'notify', // 'notify','top','box' require pro licence 247 notifyOnce: false, 248 setInnerHTML: true, 249 250 //layout settings 251 layout: 'slideout', 252 position: 'left', 253 theme: 'light', 254 acceptButton: true, 255 rejectButton: true, 256 closeOnGlobalChange: true, 257 closeStyle: 'icon', 258 toggleType: 'slider', 259 notifyDismissButton: true, 260 settingsStyle: 'link', 261 excludedCountries: ['US'], 262 263 /*accessibility: { 264 disableSiteScrolling: true, 265 },*/ 266 267 statement: { 268 description: 'For more detailed information about the cookies we use, see our', 269 name: 'Cookie Policy', 270 url: 'https://www.infoq.com/cookie-policy', 271 updated: '01/01/2024', 272 }, 273 274 // cookies starting from 'cookie_expire' are from live.infoq.com but since we use the same tool on the same domain we need to specify those too so 275 // that infoq.com cookieControl does not delete live.infoq.com cookies(also infoq.com cookies have been specified in live.infoq.com cookieControl configs)
276 necessaryCookies: ['RegUserCookie', 'UserCookie', 'IdpCookie', 'ConversionTrackingV2_','PSAdialog','*P13NWN*','topbarSurvey','__bkm','JSESSIONID','mp_','_mixpanel','CloudFront-Key-Pair-Id','CloudFront-Policy','CloudFront-Signature','cookie_expire','discount_promo_closed','discount_promo_code','discount_promo_submitted','exit_survey_popup','referrer_popup','voting_popup_*','AWSALB','AWSALBCORS','aws-waf-token','iq_sub_preview'], 277 278 optionalCookies: [ 279 { 280 name: 'analytics', 281 label: 'Analytics', 282 description: 'Analytical cookies help us to improve our website by collecting and reporting information on its usage.', 283 cookies: ['_ga', '_ga*', '_gid', '_gat', '__utma', '__utmt', '__utmb', '__utmc', '__utmz', '__utmv'], 284 onAccept: function(){ 285 gtag('consent', 'update', {'analytics_storage': 'granted'}); 286 }, 287 onRevoke: function(){ 288 gtag('consent', 'update', {'analytics_storage': 'denied'}); 289 } 290 }, 291 { 292 name: 'marketing', 293 label: 'Advertising', 294 description: 'We use advertising cookies to display advertisements to you for our products.', 295 onAccept: function(){ 296 gtag('consent', 'update', {'ad_storage': 'granted', 'ad_personalization': 'granted', 'ad_user_data': 'granted'}); 297 }, 298 onRevoke: function(){ 299 gtag('consent', 'update', {'ad_storage': 'denied', 'ad_personalization': 'denied', 'ad_user_data': 'denied'}); 300 } 301 } 302 ], 303 304 text : { 305 // main preference panels 306 title: '<h3>Our use of cookies</h3>', 307 intro: 'We use necessary cookies to make our site work. Functional cookies help enhance the performance and functionality of the site. '+ 308 'We\'d also like to set analytics cookies to help us improve your experience by measuring how you use the site. '+ 309 'These will be set only if you accept. ', 310 acceptSettings: 'I Accept', 311 rejectSettings: 'I Do Not Accept', 312 necessaryTitle : '<h3>Necessary Cookies</h3>', 313 necessaryDescription : 'Necessary cookies enable core functionality ' + 314 'such as page navigation and access to secure areas. '+ 315 'The website cannot function properly without '+ 316 'these cookies, and can only be disabled by changing '+ 317 'your browser preferences.', 318 closeLabel: 'Close Cookie Control', 319 cornerButton: 'Set cookie preferences', 320 // main preference panel controls 321 on: 'On', 322 off : 'Off', 323 thirdPartyTitle : 'Some cookies require your attention', 324 thirdPartyDescription : 'Consent for the following cookies could not be '+ 325 'automatically revoked. Please follow the link(s) '+ 326 'below to opt out manually.', 327 // notification panels (only accessible for pro licences) 328 notifyTitle : 'Your choice regarding cookies on this site', 329 notifyDescription : 'We use cookies to optimise site functionality and '+ 330 'give you the best possible experience.', 331 accept : 'I Accept', 332 reject: 'I Do Not Accept', 333 settings : 'Settings', 334 }, 335 branding : { 336 removeAbout: true, 337 }, 338 }; 339 // do not load this for local envs only. for testing on local envs remove/modify this condition 340 if(InfoQConstants.pageUrl.indexOf('local')===-1){ 341 CookieControl.load( config ); 342 } 343</script>
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
364<script type="application/ld+json"> 365{ 366 "@context": "http://schema.org", 367 "@type": "NewsArticle", 368 "mainEntityOfPage": { 369 "@type": "WebPage", 370 "@id": "https://www.infoq.com/news/2026/09/airbnb-server-driven-login/" 371 }, 372 "headline": "Airbnb Cuts Authentication Code by 60% with Server Driven Architecture", 373 "image": ["https://res.infoq.com/news/2026/09/airbnb-server-driven-login/en/headerimage/generatedHeaderImage-1787593560494.jpg" 374 ], 375 "datePublished": "2026-09-04T14:30:00+0000", 376 "dateModified": "2026-09-04T14:30:00+0000", 377 "author": [ 378 { 379 "@type": "Person", 380 "name": "Leela Kumili", 381 "url": "https://www.infoq.com/profile/Leela-Kumili/" 382 } 383 ], 384 "publisher": { 385 "@type": "Organization", 386 "name": "InfoQ", 387 "logo": { 388 "@type": "ImageObject", 389 "url": "https://assets.infoq.com/resources/en/infoQ-logo-big.jpg" 390 } 391 }, 392 393 "description": "Airbnb redesigned its authentication architecture around server driven flows and policy based challenge selection. The new Flexible Authentication system reduced authentication related code by 60%, cu" 394} 395</script>
395 396 397 <meta name="ifq:pageType" content="NEWS_PAGE"/> 398
398<script type="text/javascript"> 399 InfoQConstants.pageType = 'NEWS_PAGE'; 400 </script>
400 401 402 403 <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260930115701/styles/prism.css"/> 404 <meta name="keywords" content="airbnb server driven login,Development,Architecture & Design,Rule Engines,Identity Management,Evolutionary Architecture,GUI,Experiment Driven Development,Web,Mobile Development,Distributed Systems,Web Applications,policy,Scalability,Software Engineering,User Experience,Authentication,Mobile Apps,Architecture,"/> 405 <meta name="description" content="Airbnb redesigned its authentication architecture around server driven flows and policy based challenge selection. The new Flexible Authentication system reduced authentication related code by 60%, cu"/> 406 <meta name="tprox" content="1788532200000" /> 407 408 409 410 411 412 413 414 415 416<meta property="og:type" content="website" /> 417 418 419 420 421 422 423 424 425 426 427 428 <meta property="og:image" content="https://res.infoq.com/news/2026/09/airbnb-server-driven-login/en/headerimage/generatedHeaderImage-1787593560494.jpg"/> 429 430 431 432 433 434 435 436 437 438 <meta property="twitter:image" content="https://res.infoq.com/news/2026/09/airbnb-server-driven-login/en/card_header_image/generatedCard-1787593560494.jpg"/> 439 440 441 442 443 444 445 446 447<meta property="og:title" content="Airbnb Cuts Authentication Code by 60% with Server Driven Architecture "/> 448<meta property="og:description" content="Airbnb redesigned its authentication architecture around server driven flows and policy based challenge selection. The new Flexible Authentication system reduced authentication related code by 60%, cut the web client bundle by 100 KB, improved successful authentication by 2.6%, reduced duplicate account creation by 27%, and lowered OTP costs by 11%." /> 449<meta property="og:site_name" content="InfoQ"/> 450<meta property="og:url" content="https://www.infoq.com/news/2026/09/airbnb-server-driven-login/"/> 451 452<meta name="twitter:card" content="summary_large_image" /> 453<meta name="twitter:title" content="Airbnb Cuts Authentication Code by 60% with Server Driven Architecture "/> 454<meta name="twitter:description" content="Airbnb redesigned its authentication architecture around server driven flows and policy based challenge selection. The new Flexible Authentication system reduced authentication related code by 60%, cut the web client bundle by 100 KB, improved successful authentication by 2.6%, reduced duplicate account creation by 27%, and lowered OTP costs by 11%." /> 455 456 457 <link rel="image_src" href="https://res.infoq.com/news/2026/09/airbnb-server-driven-login/en/headerimage/generatedHeaderImage-1787593560494.jpg"/> 458 459 460 461 462
462<script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260930115701/scripts/relatedVcr.min.js"></script>
462 463
463<script type="application/javascript"> 464 var communityIds = "2497,2498"; 465 var topicIds = "724,1103,6923,757,1861,2938,2283,1964,2090,40,996,2616,869,1818,4345,876"; 466 VCR.loadAllVcrs(communityIds, topicIds); 467 </script>
467 468 469 470 471 472
472<script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260930115701/scripts/infoq.js"></script>
472 473 474
474<script type="text/javascript"> 475 document.addEventListener('DOMContentLoaded', function() { 476 if (!window || !window.infoq) return 477 infoq.init() 478 }) 479 </script>
479 480 481
481<script defer data-domain="infoq.com" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script>
481 482
482<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
482 483 484 </head> 485 486 <body > 487 488 489 490 491 492 493 494<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 494-495
494 495<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
495GTM-W9GJ5DL
vendor: 83 bytes, lines 495-496
495" 496height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
497<!-- End Google Tag Manager (noscript) --> 498 499 <div class="intbt"> 500 <a href="/int/bt/" title="bt">BT</a> 501 </div> 502 503 504 505 506 507 508 509 510
511<script type="text/javascript"> 512 var allCountries = [{"id":3,"name":"Afghanistan"},{"id":244,"name":"à land"},{"id":6,"name":"Albania"},{"id":61,"name":"Algeria"},{"id":13,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":9,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":11,"name":"Antarctica"},{"id":4,"name":"Antigua and Barbuda"},{"id":12,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":16,"name":"Aruba"},{"id":15,"name":"Australia"},{"id":14,"name":"Austria"},{"id":17,"name":"Azerbaijan"},{"id":31,"name":"Bahamas"},{"id":24,"name":"Bahrain"},{"id":20,"name":"Bangladesh"},{"id":19,"name":"Barbados"},{"id":35,"name":"Belarus"},{"id":21,"name":"Belgium"},{"id":36,"name":"Belize"},{"id":26,"name":"Benin"},{"id":27,"name":"Bermuda"},{"id":32,"name":"Bhutan"},{"id":29,"name":"Bolivia"},{"id":254,"name":"Bonaire, Sint Eustatius, and Saba"},{"id":18,"name":"Bosnia and Herzegovina"},{"id":34,"name":"Botswana"},{"id":33,"name":"Bouvet Island"},{"id":30,"name":"Brazil"},{"id":104,"name":"British Indian Ocean Territory"},{"id":28,"name":"Brunei Darussalam"},{"id":23,"name":"Bulgaria"},{"id":22,"name":"Burkina Faso"},{"id":25,"name":"Burundi"},{"id":114,"name":"Cambodia"},{"id":46,"name":"Cameroon"},{"id":37,"name":"Canada"},{"id":52,"name":"Cape Verde"},{"id":121,"name":"Cayman Islands"},{"id":40,"name":"Central African Republic"},{"id":207,"name":"Chad"},{"id":45,"name":"Chile"},{"id":47,"name":"China"},{"id":53,"name":"Christmas Island"},{"id":38,"name":"Cocos (Keeling) Islands"},{"id":48,"name":"Colombia"},{"id":116,"name":"Comoros"},{"id":39,"name":"Congo (Democratic Republic)"},{"id":41,"name":"Congo (People\u0027s Republic)"},{"id":44,"name":"Cook Islands"},{"id":49,"name":"Costa Rica"},{"id":43,"name":"Cote D\u0027Ivoire"},{"id":97,"name":"Croatia"},{"id":51,"name":"Cuba"},{"id":253,"name":"Curaçao"},{"id":54,"name":"Cyprus"},{"id":55,"name":"Czech Republic"},{"id":58,"name":"Denmark"},{"id":57,"name":"Djibouti"},{"id":59,"name":"Dominica"},{"id":60,"name":"Dominican Republic"},{"id":213,"name":"East Timor"},{"id":62,"name":"Ecuador"},{"id":64,"name":"Egypt"},{"id":203,"name":"El Salvador"},{"id":87,"name":"Equatorial Guinea"},{"id":66,"name":"Eritrea"},{"id":63,"name":"Estonia"},{"id":68,"name":"Ethiopia"},{"id":72,"name":"Falkland Islands (Malvinas)"},{"id":74,"name":"Faroe Islands"},{"id":71,"name":"Fiji"},{"id":70,"name":"Finland"},{"id":75,"name":"France"},{"id":80,"name":"French Guiana"},{"id":170,"name":"French Polynesia"},{"id":208,"name":"French Southern Territories"},{"id":76,"name":"Gabon"},{"id":84,"name":"Gambia"},{"id":79,"name":"Georgia"},{"id":56,"name":"Germany"},{"id":81,"name":"Ghana"},{"id":82,"name":"Gibraltar"},{"id":88,"name":"Greece"},{"id":83,"name":"Greenland"},{"id":78,"name":"Grenada"},{"id":86,"name":"Guadeloupe"},{"id":91,"name":"Guam"},{"id":90,"name":"Guatemala"},{"id":249,"name":"Guernsey"},{"id":85,"name":"Guinea"},{"id":92,"name":"Guinea-Bissau"},{"id":93,"name":"Guyana"},{"id":98,"name":"Haiti"},{"id":95,"name":"Heard Island and McDonald Islands"},{"id":96,"name":"Honduras"},{"id":94,"name":"Hong Kong"},{"id":99,"name":"Hungary"},{"id":107,"name":"Iceland"},{"id":103,"name":"India"},{"id":100,"name":"Indonesia"},{"id":106,"name":"Iran"},{"id":105,"name":"Iraq"},{"id":101,"name":"Ireland"},{"id":245,"name":"Isle of Man"},{"id":102,"name":"Israel"},{"id":108,"name":"Italy"},{"id":109,"name":"Jamaica"},{"id":111,"name":"Japan"},{"id":250,"name":"Jersey"},{"id":110,"name":"Jordan"},{"id":122,"name":"Kazakhstan"},{"id":112,"name":"Kenya"},{"id":115,"name":"Kiribati"},{"id":243,"name":"Kosovo"},{"id":120,"name":"Kuwait"},{"id":113,"name":"Kyrgyzstan"},{"id":123,"name":"Laos"},{"id":132,"name":"Latvia"},{"id":124,"name":"Lebanon"},{"id":129,"name":"Lesotho"},{"id":128,"name":"Liberia"},{"id":133,"name":"Libya"},{"id":126,"name":"Liechtenstein"},{"id":130,"name":"Lithuania"},{"id":131,"name":"Luxembourg"},{"id":143,"name":"Macau"},{"id":139,"name":"Macedonia"},{"id":137,"name":"Madagascar"},{"id":151,"name":"Malawi"},{"id":153,"name":"Malaysia"},{"id":150,"name":"Maldives"},{"id":140,"name":"Mali"},{"id":148,"name":"Malta"},{"id":138,"name":"Marshall Islands"},{"id":145,"name":"Martinique"},{"id":146,"name":"Mauritania"},{"id":149,"name":"Mauritius"},{"id":238,"name":"Mayotte"},{"id":152,"name":"Mexico"},{"id":73,"name":"Micronesia"},{"id":136,"name":"Moldova"},{"id":135,"name":"Monaco"},{"id":142,"name":"Mongolia"},{"id":246,"name":"Montenegro"},{"id":147,"name":"Montserrat"},{"id":134,"name":"Morocco"},{"id":154,"name":"Mozambique"},{"id":141,"name":"Myanmar"},{"id":155,"name":"Namibia"},{"id":164,"name":"Nauru"},{"id":163,"name":"Nepal"}
512,{"id":161,"name":"Netherlands"},{"id":8,"name":"Netherlands Antilles"},{"id":156,"name":"New Caledonia"},{"id":166,"name":"New Zealand"},{"id":160,"name":"Nicaragua"},{"id":157,"name":"Niger"},{"id":159,"name":"Nigeria"},{"id":165,"name":"Niue"},{"id":158,"name":"Norfolk Island"},{"id":118,"name":"North Korea"},{"id":144,"name":"Northern Mariana Islands"},{"id":162,"name":"Norway"},{"id":167,"name":"Oman"},{"id":173,"name":"Pakistan"},{"id":180,"name":"Palau"},{"id":178,"name":"Palestinian Territory"},{"id":168,"name":"Panama"},{"id":171,"name":"Papua New Guinea"},{"id":181,"name":"Paraguay"},{"id":169,"name":"Peru"},{"id":172,"name":"Philippines"},{"id":176,"name":"Pitcairn"},{"id":174,"name":"Poland"},{"id":179,"name":"Portugal"},{"id":177,"name":"Puerto Rico"},{"id":182,"name":"Qatar"},{"id":183,"name":"Reunion"},{"id":184,"name":"Romania"},{"id":185,"name":"Russian Federation"},{"id":186,"name":"Rwanda"},{"id":193,"name":"Saint Helena"},{"id":117,"name":"Saint Kitts and Nevis"},{"id":125,"name":"Saint Lucia"},{"id":251,"name":"Saint Martin"},{"id":175,"name":"Saint Pierre and Miquelon"},{"id":229,"name":"Saint Vincent and the Grenadines"},{"id":247,"name":"Saint-Barthélemy"},{"id":236,"name":"Samoa"},{"id":198,"name":"San Marino"},{"id":202,"name":"Sao Tome and Principe"},{"id":187,"name":"Saudi Arabia"},{"id":199,"name":"Senegal"},{"id":248,"name":"Serbia"},{"id":189,"name":"Seychelles"},{"id":197,"name":"Sierra Leone"},{"id":192,"name":"Singapore"},{"id":252,"name":"Sint Maarten"},{"id":196,"name":"Slovakia"},{"id":194,"name":"Slovenia"},{"id":188,"name":"Solomon Islands"},{"id":200,"name":"Somalia"},{"id":239,"name":"South Africa"},{"id":89,"name":"South Georgia and the South Sandwich Islands"},{"id":119,"name":"South Korea"},{"id":255,"name":"South Sudan"},{"id":67,"name":"Spain"},{"id":127,"name":"Sri Lanka"},{"id":190,"name":"Sudan"},{"id":201,"name":"Suriname"},{"id":195,"name":"Svalbard and Jan Mayen"},{"id":205,"name":"Swaziland"},{"id":191,"name":"Sweden"},{"id":42,"name":"Switzerland"},{"id":204,"name":"Syria"},{"id":220,"name":"Taiwan"},{"id":211,"name":"Tajikistan"},{"id":221,"name":"Tanzania"},{"id":210,"name":"Thailand"},{"id":209,"name":"Togo"},{"id":212,"name":"Tokelau"},{"id":216,"name":"Tonga"},{"id":218,"name":"Trinidad and Tobago"},{"id":215,"name":"Tunisia"},{"id":217,"name":"Turkey"},{"id":214,"name":"Turkmenistan"},{"id":206,"name":"Turks and Caicos Islands"},{"id":219,"name":"Tuvalu"},{"id":223,"name":"Uganda"},{"id":222,"name":"Ukraine"},{"id":2,"name":"United Arab Emirates"},{"id":77,"name":"United Kingdom"},{"id":224,"name":"United States Minor Outlying Islands"},{"id":226,"name":"Uruguay"},{"id":225,"name":"USA"},{"id":227,"name":"Uzbekistan"},{"id":234,"name":"Vanuatu"},{"id":228,"name":"Vatican City (Holy See)"},{"id":230,"name":"Venezuela"},{"id":233,"name":"Vietnam"},{"id":231,"name":"Virgin Islands (British)"},{"id":232,"name":"Virgin Islands (U.S.)"},{"id":235,"name":"Wallis and Futuna"},{"id":65,"name":"Western Sahara"},{"id":237,"name":"Yemen"},{"id":241,"name":"Zaire"},{"id":240,"name":"Zambia"},{"id":242,"name":"Zimbabwe"}]; 513 var gdprCountriesIds = [196,194,191,184,179,174,161,148,132,131,130,108,101,99,97,88,77,75,70,67,63,58,56,55,54,37,23,21,14]; 514</script>
514 515 516 517 518 519 520 521 522 523 524 <section data-nosnippet class="section container subscribe-box hidden"> 525 <div class="container__inner"> 526 <div class="actions"> 527 <div class="actions__left"> 528 <h2>InfoQ Software Architects' Newsletter</h2> 529 <span><p>A monthly overview of things you need to know as an architect or aspiring architect.</p> 530 531<p><a href="https://www.infoq.com/software-architects-newsletter#placeholderPastIssues">View an example</a></p> 532</span> 533 <div class="newsletter__subscribe"> 534 <form class="form gdpr" name="dataCollectCampaignNewsletterForm" id="dataCollectCampaignNewsletterForm" action="#" onsubmit="dataCollectNewsletter.saveSubscription(); return false;"> 535 <div class="field newsletter__mail input__text input__no-label input__medium email"> 536 <label for="email-dataCollectnewsletter-infoq" class="label field__label">Enter your e-mail address</label> 537 <input id="email-dataCollectnewsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/> 538 <input type="text" name="emailH" id="input_email_h_d" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/> 539 <input type="hidden" id="fnt_d" name="fnt_d" value="EHpIzrADJYuZGDbo"/> 540 <input type="hidden" id="dataCollectNewsletterType" name="dataCollectNewsletterType" value="regular"/> 541 <input type="hidden" id="cmpi_d" name="cmpi_d" value="4"/> 542 </div> 543 <div class="hidden"> 544 <span class="input__select field country"> 545 <label for="input-dataCollect-newsletter-country" class="label field__label">Select your country</label> 546 <select id="input-dataCollect-newsletter-country" class="select field__input"> 547 <option value="" class="select__option">Select a country</option> 548 </select> 549 <p class="input__message field__desc"></p> 550 </span> 551 <span class="input__checkbox field hidden"> 552 <input type="checkbox" id="gdpr-consent-campaign"> 553 <label for="gdpr-consent-campaign" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> 554 </span> 555 </div> 556 <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return dataCollectNewsletter.validateEmail('Invalid email address');"/> 557 </form> 558 <p class="meta"> 559 <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> 560 </p> 561 562 <span class="success" style="display:none;" id="dataCollectNewsletterMessage"></span> 563 </div> 564 565 </div> 566 <div class="actions__right"> 567 <button aria-label="Close" class="close closeBox button button__unstyled button__icon icon icon__close-black icon--only">Close</button> 568 </div> 569 </div> 570 </div> 571 </section> 572
572<script type="text/javascript"> 573 var dataCollectNewsletter = new Newsletter('Enter your e-mail address', 574 'email-dataCollectnewsletter-infoq', 'dataCollectNewsletterType','dataCollectNewsletterMessage', 'fnt_d', 'input_email_h_d', 'input-dataCollect-newsletter-country', 'cmpi_d','popup_all_pages'); 575 </script>
575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 <div class="infoq" id="infoq"> 591 592 <!-- ####### SITE START ######### --> 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617<header class="header"> 618 <button aria-label="Toggle Navigation" tabindex="0" class="burger header__toggle button">Toggle Navigation <span></span><span></span><span></span></button> 619 <div class="header__container container"> 620 <div class="container__inner"> 621 <div data-nosnippet class="actions header__top"> 622 <div class="actions__left"> 623 <p class="header__desc my-0"> 624 Facilitating the Spread of Knowledge and Innovation in Professional Software Development 625 </p> 626 <div class="button__dropdown dropdown header__more my-0 dropdown__center"> 627 628 629 630 631 632 633 634 635<button aria-label="English edition" class="button button__unstyled button__small">English edition </button> 636<div class="dropdown__holder"> 637 <!----> 638 <div class="dropdown__content"> 639 <ul class="no-style dropdown__nav languagesEdition"> 640 <li class="active"><a href="#" onclick="return false;">English edition</a></li> 641 <li><a href="https://www.infoq.cn">Chinese edition</a></li> 642 <li><a href="/jp/">Japanese edition</a></li> 643 <li><a href="/fr/">French edition</a></li> 644 </ul> 645 </div> 646 <!----> 647</div> 648 </div> 649 <a class="my-0 contribute-link" role="button" href="/write-for-infoq/" title="Write for InfoQ"> 650 Write for InfoQ 651 </a> 652 </div> 653 <div class="actions__right"> 654 <div> 655 <form id="searchForm" name="search-form" action="/search.action" enctype="multipart/form-data" class="search icon__search icon icon__green"> 656 <div class="field search__bar input__text input__no-label input__small"> 657 <label for="search" class="label field__label">Search</label> 658 <input name="queryString" type="text" id="search" value="" placeholder="Search" class="input field__input"> 659 <input type="hidden" name="page" value="1"/> 660 <input type="hidden" size="15" name="searchOrder"> 661 </div> 662 <input value="Search" type="submit" class="search__go"> 663 </form> 664 </div> 665 666 667 668 669 670 671 672 673 674 <div class="action_button__group"> 675 <a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__green button__small">Register</a> 676 <a href="/social/keycloakLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__small button__outline">Sign in</a> 677 </div> 678 679 <div class="modal_auth_required"> 680 <div class="modal_auth_required__actions"> 681 <h2 class="h2">Unlock the full InfoQ experience</h2> 682 <p>Unlock the full InfoQ experience by logging in! Stay updated with your favorite authors and topics, engage with content, and download exclusive resources.</p> 683 <a href="/social/keycloakLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__has-transition">Log In</a> 684 <div class="separator"><span>or</span></div> 685 <h3 class="h3">Don't have an InfoQ account?</h3> 686 <a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button__outline button__has-transition">Register</a> 687 </div> 688 <div class="modal_auth_required__content"> 689 <ul class="newsletter__features"> 690 <li><strong>Stay updated on topics and peers that matter to you</strong>Receive instant alerts on the latest insights and trends.</li> 691 <li><strong>Quickly access free resources for continuous learning</strong>Minibooks, videos with transcripts, and training materials.</li> 692 <li><strong>Save articles and read at anytime</strong>Bookmark articles to read whenever youre ready.</li> 693 </ul> 694 </div> 695 <form id="login-form" data-vv-scope="login" class="login__form form" action="#" data-gtm-form-interact-id="0"> 696 <input type="hidden" id="loginWidgetOrigin" name="loginWidgetOrigin" value="mainLogin"> 697 <input type="hidden" name="fromP13N" id="isP13n" value=""> 698 <input type="hidden" name="fromP13NId" id="p13n-id" value=""> 699 <input type="hidden" name="fromP13NType" id="p13n-type" value=""> 700 </form> 701 </div> 702 703 704 705 </div> 706 </div> 707 <div class="header__middle"> 708 <div class="logo header__logo"> 709 <a href="/" class="logo__symbol active"> 710 Logo - Back to homepage 711 </a> 712 </div> 713 714 <div class="content-items"> 715 <a href="/news/" class="icon icon__news">News</a> 716 <a href="/articles/" class="icon icon__articles">Articles</a> 717 <a href="/presentations/" class="icon icon__presentations">Presentations</a> 718 <a href="/podcasts/" class="icon icon__podcasts">Podcasts</a> 719 <a href="/minibooks/" class="icon icon__guides">Guides</a> 720 </div> 721 <div class="header__items columns"> 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738<div> 739 <h3 class="widget__heading">Topics</h3> 740 <nav class="nav header__nav topics" data-trk-ref="header_personas"> 741 <div class="has--subnav li-nav"> 742 <a href="/development/" title="Development" class="nav__category">Development</a> 743 <div class="nav__subnav subnav"> 744 <ul class="subnav__categories no-style"> 745 <li><a href="/java/" title="Java">Java</a></li> 746 <li><a href="/kotlin/" title="Kotlin">Kotlin</a></li> 747 <li><a href="/dotnet/" title=".Net">.Net</a></li> 748 <li><a href="/c_sharp/" title="C#">C#</a></li> 749 <li><a href="/swift/" title="Swift">Swift</a></li> 750 <li><a href="/golang/" title="Go">Go</a></li> 751 <li><a href="/rust/" title="Rust">Rust</a></li> 752 <li><a href="/javascript/" title="JavaScript">JavaScript</a></li> 753 </ul> 754 <div class="subnav__content" data-id="6815"> 755 756 757 758 759 760 761 762 763 764 765<div class="heading__container actions"> 766 <div class="actions__left"> 767 <h3 class="heading section__heading">Featured in Development</h3> 768 </div> 769</div> 770<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> 771 <li> 772 <div class="card__content"> 773 <div class="card__data"> 774 775 776 777 778 779 780 781 782 783 784 <h4 class="card__title"> 785 <a href="/presentations/rust-refactoring">Accelerating Performance by Incrementally Integrating Rust into Existing Codebase</a> 786 </h4> 787 <p class="card__excerpt">Lily Mara explains how to avoid high-risk software rewrites through incremental FFI refactoring. She shares how engineering teams can replace Python bottlenecks with Rust via PyO3, demonstrating how to achieve dramatic function-level speedups, seamless integration testing, and meaningful infrastru
787cture cost savings without microservice overhead.</p> 788 <div class="card__footer"></div> 789 </div> 790 791 <a href="/presentations/rust-refactoring" class="card__header"> 792 <img loading="lazy" alt="Accelerating Performance by Incrementally Integrating Rust into Existing Codebase" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/rust-refactoring/en/smallimage/lily-mara-thumbnail-1788338447565.jpeg" class="card__image"/> 793 </a> 794 795 </div> 796 </li> 797</ul> 798 799 800 801 802<a href="/development/" class="button__more button button__large button__arrow arrow__right">All in development</a> 803 804 </div> 805 </div> 806 </div> 807 <div class="has--subnav li-nav"> 808 <a href="/architecture-design/" title="Architecture & Design" class="nav__category">Architecture & Design</a> 809 <div class="nav__subnav subnav"> 810 <ul class="subnav__categories no-style"> 811 <li><a href="/architecture/" title="Architecture">Architecture</a></li> 812 813 <li><a href="/enterprise-architecture/" title="Enterprise Architecture">Enterprise Architecture</a></li> 814 <li><a href="/performance-scalability/" title="Scalability/Performance">Scalability/Performance</a></li> 815 <li><a href="/design/" title="Design">Design</a></li> 816 <li><a href="/Case_Study/" title="Case Studies">Case Studies</a></li> 817 <li><a href="/microservices/" title="Microservices">Microservices</a></li> 818 <li><a href="/servicemesh/" title="Service Mesh">Service Mesh</a></li> 819 <li><a href="/DesignPattern/" title="Patterns">Patterns</a></li> 820 <li><a href="/Security/" title="Security">Security</a></li> 821 </ul> 822 <div class="subnav__content" data-id="6816"> 823 824 825 826 827 828 829 830 831 832 833<div class="heading__container actions"> 834 <div class="actions__left"> 835 <h3 class="heading section__heading">Featured in Architecture & Design</h3> 836 </div> 837</div> 838<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> 839 <li> 840 <div class="card__content"> 841 <div class="card__data"> 842 843 844 845 846 847 848 849 850 851 852 <h4 class="card__title"> 853 <a href="/articles/ai-agents-improve-software-architecture">Five Ways To Use AI Coding Agents to Improve Your Software Architecture</a> 854 </h4> 855 <p class="card__excerpt">Modern architectures often use legacy services for specific tasks, but these services may lack accurate documentation and using them can be risky if you don't understand them well. AI coding agents can help close that knowledge gap.</p> 856 <div class="card__footer"></div> 857 </div> 858 859 <a href="/articles/ai-agents-improve-software-architecture" class="card__header"> 860 <img loading="lazy" alt="Five Ways To Use AI Coding Agents to Improve Your Software Architecture" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/ai-agents-improve-software-architecture/en/smallimage/ai-agents-improve-software-architecture-thumbnail-1790153650841.jpg" class="card__image"/> 861 </a> 862 863 </div> 864 </li> 865</ul> 866 867 868 869 870<a href="/architecture-design/" class="button__more button button__large button__arrow arrow__right">All in architecture-design</a> 871 872 </div> 873 </div> 874 </div> 875 <div class="has--subnav li-nav"> 876 <a href="/ai-ml-data-eng/" title="AI Infrastructure" class="nav__category">AI Infrastructure</a> 877 <div class="nav__subnav subnav"> 878 <ul class="subnav__categories no-style"> 879 <li><a href="/bigdata/" title="Big Data">Big Data</a></li> 880 <li><a href="/machinelearning/" title="Machine Learning">Machine Learning</a></li> 881 <li><a href="/nosql/" title="NoSQL">NoSQL</a></li> 882 <li><a href="/database/" title="Database">Database</a></li> 883 <li><a href="/data-analytics/" title="Data Analytics">Data Analytics</a></li> 884 <li><a href="/streaming/" title="Streaming">Streaming</a></li> 885 </ul> 886 <div class="subnav__content" data-id="16690"> 887 888 889 890 891 892 893 894 895 896 897<div class="heading__container actions"> 898 <div class="actions__left"> 899 <h3 class="heading section__heading">Featured in AI, ML & Data Engineering</h3> 900 </div> 901</div> 902<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> 903 <li> 904 <div class="card__content"> 905 <div class="card__data"> 906 907 908 909 910 911 912 913 914 915 916 <h4 class="card__title"> 917 <a href="/presentations/building-internal-ai-agents">From Consumers to Builders: Turning 200 of our Team into Agent Creators in 2 Weeks</a> 918 </h4> 919 <p class="card__excerpt">Ben Maraney shares how Forter demystified AI agent creation for technical and n
919on-technical staff. He discusses leveraging custom MCP servers, combining no-code and code-based platforms, sidestepping complex RAG setups, and aligning security and legal teams to accelerate internal agent adoption across R&D.</p> 920 <div class="card__footer"></div> 921 </div> 922 923 <a href="/presentations/building-internal-ai-agents" class="card__header"> 924 <img loading="lazy" alt="From Consumers to Builders: Turning 200 of our Team into Agent Creators in 2 Weeks" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/building-internal-ai-agents/en/smallimage/thumbnail-1790246283432.jpeg" class="card__image"/> 925 </a> 926 927 </div> 928 </li> 929</ul> 930 931 932 933 934<a href="/ai-ml-data-eng/" class="button__more button button__large button__arrow arrow__right">All in ai-ml-data-eng</a> 935 936 </div> 937 </div> 938 </div> 939 <div class="has--subnav li-nav"> 940 <a href="/culture-methods/" title="Culture & Methods" class="nav__category">Culture & Methods</a> 941 <div class="nav__subnav subnav"> 942 <ul class="subnav__categories no-style"> 943 <li><a href="/agile/" title="Agile">Agile</a></li> 944 <li><a href="/diversity/" title="Diversity">Diversity</a></li> 945 <li><a href="/leadership/" title="Leadership">Leadership</a></li> 946 <li><a href="/lean/" title="Lean/Kanban">Lean/Kanban</a></li> 947 <li><a href="/personal-growth/" title="Personal Growth">Personal Growth</a></li> 948 <li><a href="/scrum/" title="Scrum">Scrum</a></li> 949 <li><a href="/sociocracy/" title="Sociocracy">Sociocracy</a></li> 950 <li><a href="/software_craftsmanship/" title="Software Craftmanship">Software Craftmanship</a></li> 951 <li><a href="/team-collaboration/" title="Team Collaboration">Team Collaboration</a></li> 952 <li><a href="/testing/" title="Testing">Testing</a></li> 953 <li><a href="/ux/" title="UX">UX</a></li> 954 </ul> 955 <div class="subnav__content" data-id="6817"> 956 957 958 959 960 961 962 963 964 965 966<div class="heading__container actions"> 967 <div class="actions__left"> 968 <h3 class="heading section__heading">Featured in Culture & Methods</h3> 969 </div> 970</div> 971<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> 972 <li> 973 <div class="card__content"> 974 <div class="card__data"> 975 976 977 978 979 980 981 982 983 984 985 <h4 class="card__title"> 986 <a href="/presentations/staff-founder-lessons">From Staff Platform Engineer to a16z Founder: What I Wish I'd Known</a> 987 </h4> 988 <p class="card__excerpt">Gonzalo Maldonado explains how technical leaders can translate engineering skills into startup success using their "VC Abstraction Layer Knowledge" (VALK). They share hard-won lessons on finding product-market fit, structuring pitches like technical docs, avoiding co-founder drama, and evaluating internal platforms as commercial ventures in a post-ZIRP environment.</p> 989 <div class="card__footer"></div> 990 </div> 991 992 <a href="/presentations/staff-founder-lessons" class="card__header"> 993 <img loading="lazy" alt="From Staff Platform Engineer to a16z Founder: What I Wish I'd Known" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/staff-founder-lessons/en/smallimage/GonzaloGloMaldonado-thumbnail-1790247060435.jpg" class="card__image"/> 994 </a> 995 996 </div> 997 </li> 998</ul> 999 1000 1001 1002 1003<a href="/culture-methods/" class="button__more button button__large button__arrow arrow__right">All in culture-methods</a> 1004 1005 </div> 1006 </div> 1007 </div> 1008 <div class="has--subnav li-nav"> 1009 <a href="/devops/" class="nav__category">DevOps</a> 1010 <div class="nav__subnav subnav"> 1011 <ul class="subnav__categories no-style"> 1012 <li>
1012<a href="/infrastructure/" title="Infrastructure">Infrastructure</a></li> 1013 <li><a href="/continuous_delivery/" title="Continuous Delivery">Continuous Delivery</a></li> 1014 <li><a href="/automation/" title="Automation">Automation</a></li> 1015 <li><a href="/containers/" title="Containers">Containers</a></li> 1016 <li><a href="/cloud-computing/" title="Cloud">Cloud</a></li> 1017 <li><a href="/observability/" title="Observability">Observability</a></li> 1018 1019 </ul> 1020 <div class="subnav__content" data-id="6043"> 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031<div class="heading__container actions"> 1032 <div class="actions__left"> 1033 <h3 class="heading section__heading">Featured in DevOps</h3> 1034 </div> 1035</div> 1036<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> 1037 <li> 1038 <div class="card__content"> 1039 <div class="card__data"> 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 <h4 class="card__title"> 1051 <a href="/presentations/context-as-code-devops-agents">Context Is the New Code</a> 1052 </h4> 1053 <p class="card__excerpt">
1053Patrick Debois discusses how to manage, evaluate, distribute, and observe context using proven software engineering practices. He shares how treating context like code - complete with testing, CI/CD, package managers, and security scanning - enables engineering leaders to reliably scale AI coding agents, maintain control over non-deterministic outputs, and build long-term organizational knowledge.</p> 1054 <div class="card__footer"></div> 1055 </div> 1056 1057 <a href="/presentations/context-as-code-devops-agents" class="card__header"> 1058 <img loading="lazy" alt="Context Is the New Code" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/context-as-code-devops-agents/en/smallimage/patrick-thumbnail-1789632704652.jpeg" class="card__image"/> 1059 </a> 1060 1061 </div> 1062 </li> 1063</ul> 1064 1065 1066 1067 1068<a href="/devops/" class="button__more button button__large button__arrow arrow__right">All in devops</a> 1069 1070 </div> 1071 </div> 1072 </div> 1073 <div class="li-nav"> 1074 1075 <a rel="noreferrer noopener" href="https://events.infoq.com/" class="nav__category" title="Events" target="_blank">Events</a> 1076 </div> 1077 1078 1079 </nav> 1080</div> 1081 1082<div> 1083 <h3 class="widget__heading">Helpful links</h3> 1084 <ul class="no-style header__nav"> 1085 <li> 1086 <a href="/about-infoq" title="About InfoQ"> 1087 About InfoQ 1088 </a> 1089 </li> 1090 <li> 1091 <a href="/infoq-editors" title="InfoQ Editors"> 1092 InfoQ Editors 1093 </a> 1094 </li> 1095 <li> 1096 <a href="/write-for-infoq" title="Write for InfoQ"> 1097 Write for InfoQ 1098 </a> 1099 </li> 1100 <li> 1101 <a href="https://c4media.com/" target="_blank" title="About C4Media"> 1102 About C4Media 1103 </a> 1104 </li> 1105 <li> 1106 <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> 1107 </li> 1108 </ul> 1109</div> 1110 1111 1112 <div> 1113 <h3 class="widget__heading">Choose your language</h3> 1114 1115 1116 1117 1118 1119 1120 1121 1122<ul class="language__switcher no-style"> 1123 <li class="active"><a href="#" onclick="return false;" title="InfoQ English">En</a></li> 1124 <li><a href="https://www.infoq.cn">䏿</a></li> 1125 <li><a href="/jp/">æ¥æ¬</a></li> 1126 <li><a href="/fr/">Fr</a></li> 1127</ul> 1128 </div> 1129 </div> 1130 1131 </div> 1132 <div data-nosnippet class="actions header__bottom header__bottom__events"> 1133 <div class="actions__left"> 1134 <div class="events-list" role="list" aria-label="Upcoming events"> 1135 <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-10-09"> 1136 <a class="event-card" href="https://certification.qconferences.com/architecture?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortarchitecture26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ Architect Certification, Oct 9, 2026"> 1137 <div class="event-date"> 1138 <div class="event-date-box" aria-hidden="true"><span>Oct</span><span>
11389,</span><span>2026</span></div> 1139 </div> 1140 <div class="event-content"> 1141 <p class="event-title">Architect Certification</p> 1142 <p class="event-description">Distributed systems, decentralized decisions, platform engineering, and AI architecture. <br/><strong>Online. Register Now.</strong></p> 1143 </div> 1144 </a> 1145 </div> 1146 <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-10-14"> 1147 <a class="event-card" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortaisecurity26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ AI Security & Privacy Engineering Certification, Oct 14, 2026"> 1148 <div class="event-date"> 1149 <div class="event-date-box" aria-hidden="true"><span>Oct</span><span>14,</span><span>2026</span></div> 1150 </div> 1151 <div class="event-content"> 1152 <p class="event-title">AI Security & Privacy Engineering Certification</p> 1153 <p class="event-description">Secure and govern production AI systems, from sensitive data to guardrails, evals, and audits.<br><strong>Online. Register now.</strong></p> 1154 </div> 1155 </a> 1156 </div> 1157 <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-10-19"> 1158 <a class="event-card" href="https://certification.qconferences.com/ai-assisted-engineering?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortaiassistedengineering26" target="_blank" rel="noopener noreferrer" aria-label="AI-Assisted Engineering Certification, Sep 18, 2026"> 1159 <div class="event-date"> 1160 <div class="event-date-box" aria-hidden="true"><span>Oct</span><span>19,</span><span>2026</span></div> 1161 </div> 1162 <div class="event-content"> 1163 <p class="event-title">AI-Assisted Engineering Certification</p> 1164 <p class="event-description">Your coding agent moves fast. Who checks whether it's making the codebase better? <br/><strong>Online. Register Now.</strong></p> 1165 </div> 1166 </a> 1167 </div> 1168 <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-11-17"> 1169 <a class="event-card" href="https://certification.qconferences.com/high-performing-teams?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortteams26" target="_blank" rel="noopener noreferrer" aria-label="High-Performing Teams Certification, November 17, 2026"> 1170 <div class="event-date"> 1171 <div class="event-date-box" aria-hidden="true"><span>Nov</span><span>17,</span><span>2026</span></div> 1172 </div> 1173 <div class="event-content"> 1174 <p class="event-title">High-Performing Teams Certification</p> 1175 <p class="event-description">Compare team design, delivery flow, AI roles, and metrics with experienced practitioners. <br/><strong>Online. Register Now.</strong></p> 1176 </div> 1177 </a> 1178 </div> 1179 1180 <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-11-16"> 1181 <a class="event-card" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qsf26" target="_blank" rel="noopener noreferrer" aria-label="QCon San Francisco, Nov 16-20, 2026"> 1182 <div class="event-date"> 1183 <div class="event-date-box" aria-hidden="true"><span>Nov</span><span>16-20,</span><span>2026</span></div> 1184 </div> 1185 <div class="event-content"> 1186 <p class="event-title">QCon San Francisco</p> 1187 <p class="event-description">What's working across AI, architecture, and leadership, from the teams doing it. <br/><strong>Register. Early bird ends Oct 13.</strong></p> 1188 </div> 1189 </a> 1190 </div> 1191 <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-12-15"> 1192 <a class="event-card" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qainy26" target="_blank" rel="noopener noreferrer" aria-label="QCon AI New York, December 15-16, 2026"> 1193 <div class="event-date"> 1194 <div class="event-date-box" aria-hidden="true"><span>Dec</span><span>15-16,</span><span>2026</span></div> 1195 </div> 1196 <div class="event-content"> 1197 <p class="event-title">QCon AI New York</p> 1198 <p class="event-description">Production AI across agents, context, evals, security, and infrastru
1198cture, from the senior engineers building it.<br/><strong>Register. Early bird ends Oct 13.</strong></p> 1199 </div> 1200 </a> 1201 </div> 1202 <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2027-04-13"> 1203 <a class="event-card" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qconlondon27" target="_blank" rel="noopener noreferrer" aria-label="QCon London, April 13-16, 2027"> 1204 <div class="event-date"> 1205 <div class="event-date-box" aria-hidden="true"><span>Apr</span><span>13-16,</span><span>2027</span></div> 1206 </div> 1207 <div class="event-content"> 1208 <p class="event-title">QCon London</p> 1209 <p class="event-description">What early-adopter teams have proven in production, across 15 engineering tracks. <br/><strong>Register. Early bird ends Oct 13.</strong></p> 1210 </div> 1211 </a> 1212 </div> 1213 <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2027-07-08"> 1214 <a class="event-card" href="https://boston.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qaiboston27" target="_blank" rel="noopener noreferrer" aria-label="QCon AI Boston, July 8-9, 2027"> 1215 <div class="event-date"> 1216 <div class="event-date-box" aria-hidden="true"><span>Jul</span><span>8-9,</span><span>2027</span></div> 1217 </div> 1218 <div class="event-content"> 1219 <p class="event-title">QCon AI Boston</p> 1220 <p class="event-description">Learn from the decisions and trade-offs behind AI systems already running in production.<br/><strong>Registration open.</strong></p> 1221 </div> 1222 </a> 1223 </div> 1224 </div> 1225 </div> 1226 <!----> 1227 </div> 1228 </div> 1229 </div> 1230</header> 1231 1232 1233 1234 <!-- ####### CONTENT START ######### --> 1235 <main> 1236 1237 <article data-type="news" class="article"> 1238 <section class="section container white"> 1239 <div class="container__inner"> 1240 1241 1242 1243 1244 1245 1246 1247<p class="crumbs"> 1248 <span data-nosnippet><a href="/" title="InfoQ Homepage">InfoQ Homepage</a></span> 1249 1250 1251 1252 1253 <span data-nosnippet><a href="/news" title="News">News</a></span> 1254 1255 1256 <span data-nosnippet class="active">Airbnb Cuts Authentication Code by 60% with Server Driven Architecture</span> 1257 1258 1259 1260 1261 1262</p> 1263 1264 <div class="actions"> 1265 <div class="actions__left"> 1266 1267 1268 1269 1270 1271 1272 1273 1274 <div class="article__category architecture-design"> 1275 1276 <a 1277 1278 href="/architecture-design/" 1279 1280 class="article__tag box--info" title="Architecture & Design"> 1281 1282 Architecture & Design 1283 </a> 1284 1285 </div> 1286 1287 </div> 1288 <div class="actions__right"> 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 </div> 1301 </div> 1302 <div class="actions heading__container article__heading"> 1303 <div class="actions__left"> 1304 <h1 class="heading"> 1305 Airbnb Cuts Authentication Code by 60% with Server Driven Architecture 1306 </h1> 1307 </div> 1308 </div> 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322
1323<script type="text/javascript"> 1324 $("#translated_"+InfoQConstants.userDetectedCountryCode.toLowerCase()).show(); 1325</script>
1325 1326 1327 <div class="columns article__explore"> 1328 <div class="column article__main" data-col="4/6"> 1329 <div class="column article__metadata metadata"> 1330 <p class="article__readTime date">Sep 04, 2026<span class="dot"></span> 1331 1332 1333 1334 1335 2 1336 min read 1337 1338 </p> 1339 <div class="widget article__authors"> 1340 <div> 1341 <p class="meta">by</p> 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356<ul class="no-style authors"> 1357 1358 1359 1360 1361 <li data-id="author-Leela-Kumili"> 1362 <p class="meta author__bio"> 1363 1364 <a href="/profile/Leela-Kumili/" class="avatar author__avatar" aria-label="Leela Kumili"></a> 1365 <span class="author__name"> 1366 <a href="/profile/Leela-Kumili/" class="author__link">Leela Kumili</a> 1367 </span> 1368 </p> 1369 1370 </li> 1371 1372</ul> 1373 </div> 1374 1375 </div> 1376 1377 1378 1379 1380 1381 1382 1383 1384<div data-nosnippet class="cta_write_infoq"> 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 <h4 class="heading text-left footer__heading">Follow us on </h4> 1400 <div class="social__links columns social__links__row"> 1401 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/4bg6QM8" target="_blank"><span class="icon icon__large icon__social icon__youtube"></span><div><span class="social__count" style="font-weight:700 !important">Youtube</span><span class="social__followers">232K Followers</span></div></a> 1402 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/44IzAtf" target="_blank"><span class="icon icon__large icon__social icon__linkedin"></span><div><span class="social__count" style="font-weight:700 !important">Linkedin</span><span class="social__followers">26K Followers</span></div></a> 1403 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/4eYXrtM" target="_blank"><span class="icon icon__large icon__social icon__instagram"></span><div><span class="social__count" style="font-weight:700 !important">Instagram</span><span class="social__followers">New</span></div></a> 1404 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/3RaJalC" target="_blank"><span class="icon icon__large icon__social icon__rss"></span><div><span class="social__count" style="font-weight:700 !important">RSS</span><span class="social__followers">19K Readers</span></div></a> 1405 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/4pfxivv" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span><div><span class="social__count" style="font-weight:700 !important">X</span><span class="social__followers">57.1k Followers</span></div></a> 1406 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/3QrGMH2" target="_blank"><span class="icon icon__large icon__social icon__fb"></span><div><span class="social__count" style="font-weight:700 !important">Facebook</span><span class="social__followers">21K Likes</span></div></a> 1407 <a style="color:#222 !important;" rel="noreferrer noopener" href="https://bit.ly/4eS8FjG" target="_blank"><span class="icon icon__large icon__social icon__bluesky"></span><div><span class="social__count" style="font-weight:700 !important">Bluesky</span><span class="social__followers">New</span></div></a> 1408 </div> 1409 1410</div> 1411 1412 <div class="widgets"></div> 1413 </div> 1414 <div class="article__content"> 1415 1416 1417 1418 1419 1420 1421 1422 1423 <div class="actions__left actions__sidebar article__actions"> 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
1434<script type="application/javascript"> 1435var playing = false; 1436function ttsPlaying(content_url) { 1437 if (loggedIn && !playing) { 1438 gtag('event', 'GA4_EVENT', { 1439 'category': 'tts', 1440 'action': 'play', 1441 'label': content_url 1442 }); 1443 playing = true; 1444 } 1445} 1446</script>
1446 1447 1448 <div id="audio-overlay" role="button" tabindex="0" aria-label="Click to open audio player" class="audio-overlay-main"> 1449 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none"> 1450 <path d="M3.33337 2L12.6667 8L3.33337 14V2Z" fill="currentColor" stroke="currentColor" 1451 stroke-linecap="round" stroke-linejoin="round"></path> 1452 </svg> 1453 <span class="audio-overlay-main-text">Listen to this article - <span id="total-length">0:00</span></span> 1454 </div> 1455 1456 1457 <div id="audio-player-container" role="region" aria-label="Audio player" class="hidden audio-player-container-main"> 1458 <div id="status-announcer" aria-live="polite" class="sr-only">Audio ready to play</div> 1459 <div> 1460 <audio id="audio-player" preload="metadata" aria-hidden="true" class="hidden" onplaying="ttsPlaying('/news/2026/09/airbnb-server-driven-login');"> 1461 <source src="" type="audio/mpeg"> 1462 Your browser does not support the audio element. 1463 </audio> 1464 <div class="play-container"> 1465 <button id="play-button" aria-label="Play audio" aria-pressed="false" 1466 class="play-button-main"> 1467 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none"> 1468 <path d="M3.33337 2L12.6667 8L3.33337 14V2Z" fill="currentColor" stroke="currentColor" 1469 stroke-linecap="round" stroke-linejoin="round"></path> 1470 </svg> 1471 </button> 1472 <div class="audio-container"> 1473 <div class="audio-controls"> 1474 <span id="current-time" role="timer" class="audio-timer">0:00</span> 1475 <div id="progress-container" role="slider" aria-label="Audio progress" aria-valuemin="0" 1476 aria-valuemax="100" aria-valuenow="NaN" tabindex="0" class="audio-progress-container" 1477 aria-valuetext="0:00 of NaN:NaN"> 1478 <div class="custom-progress-container"> 1479 <div id="progress-bar" class="custom-progress-bar"></div> 1480 <div id="progress-handle" class="opacity-0 custom-progress-handle"></div> 1481 </div> 1482 <div class="audio-progress-wrapper"> 1483 <div id="progress-bar" class="audio-progress-bar"></div> 1484 <div id="progress-handle" class="opacity-0 audio-progress-handle"></div> 1485 </div> 1486 </div> 1487 <span id="duration" role="timer" class="audio-timer">0:00</span> 1488 <div class="flex gap-2 items-center"> 1489 <button id="volume-button" aria-label="Toggle mute" 1490 type="button" class="custom-volume-button"> 1491 <svg xmlns="http://www.w3.org/2000/svg" 1492 width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" 1493 stroke-width="2" stroke-linecap="round" stroke-linejoin="round" 1494 class="text-muted-foreground-custom"> 1495 <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon> 1496 <path d="M15.54 8.46a5 5 0 0 1 0 7.07"></path> 1497 <path d="M19.07 4.93a10 10 0 0 1 0 14.14"></path> 1498 </svg> 1499 </button> 1500 <div id="volume-slider" role="slider" aria-label="Volume" aria-valuemin="0" 1501 aria-valuemax="100" aria-valuenow="100" tabindex="0" class="custom-slider"> 1502 <div class="audio-progress-wrapper"> 1503 <div id="volume-bar" class="custom-volume-bar"></div> 1504 <div id="volume-handle" class="custom-volume-handle"></div> 1505 </div> 1506 </div> 1507 </div> 1508 <div class="custom-relative-wrapper"> 1509 <button id="speed-button" type="button" 1510 aria-label="Playback speed settings" class="custom-speed-button"> 1511 <svg 1512 xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" 1513 fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" 1514 stroke-linejoin="round" class="custom-speed-button-icon"> 1515 <path 1516 d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"> 1517 </path> 1518 <circle cx="12" cy="12" r="3"></circle> 1519 </svg> 1520 </button> 1521 <div id="speed-menu" role="menu" aria-orientation="vertical" aria-labelledby="speed-button" 1522 class="hidden custom-speed-menu"><button role="menuitem" tabindex="0" data-speed="1" 1523 data-active="true" class="custom-speed-menu-item">Normal</button><button 1524 role="menuitem" tabindex="0" data-speed="1.25" 1525 class="custom-speed-menu-item">1.25x</button><button role="menuitem" tabindex="0" 1526 data-speed="1.5" class="custom-speed-menu-item">1.5x</button></div> 1527 </div> 1528 </div> 1529 </div> 1530 </div> 1531 </div> 1532 </div> 1533 1534
1535 <button id="toggleLikeContent" class="icon button button__icon like button__gray icon__like" aria-label="Like">Like</button> 1536 1537 1538 1539 1540 1541 1542 1543 1544 <div class="bookmarkReading"> 1545 <button id="bookmarkBtn" data-ref="bookmarkPage" aria-label="Read later" class="login button__gray button button__icon icon icon__bookmark icon--only"> </button> 1546 <!-- new dropdown rading list --> 1547 <div class="my-0 button__dropdown dropdown reading_list dropdown__center" id="showBookmarks"> 1548 <button aria-label="Reading list" class="button button__unstyled button__small"></button> 1549 <div class="dropdown__holder"> 1550 <div class="dropdown__content"> 1551 <ul class="no-style dropdown__nav"> 1552 <li class="active"><a href="/showbookmarks.action">Reading list</a></li> 1553 </ul> 1554 </div> 1555 </div> 1556 </div> 1557 1558 <div id="toastContainer" class="toast-none toast-hide"> 1559 <div class="toast"><span></span></div> 1560 </div> 1561 </div> 1562 1563
1564<script type="text/javascript"> 1565 1566 if(loggedIn){ 1567 $('#showBookmarks').css('display', 'flex'); 1568 } 1569 1570 function performBookmark() { 1571 Bookmarks.toggleBookmark('news', '2026/09/airbnb-server-driven-login'); 1572 } 1573 1574 infoq.event.on('bookmarkRequested', function(e) { 1575 Bookmarks.toggleBookmark('news', '2026/09/airbnb-server-driven-login'); 1576 }); 1577 1578 infoq.event.on("loaded", function(){ 1579 if(loggedIn){ 1580 var href = window.location.href; 1581 if(href.indexOf("#bookmarkPage") != -1){ 1582 $('#bookmarkBtn').click(); 1583 } 1584 } 1585 }); 1586 1587 $(document).ready(function() { 1588 if(Bookmarks.isContentBookmarked == 'true'){ 1589 $('#bookmarkBtn').addClass('button__green'); 1590 $('#bookmarkBtn').removeClass('button__gray'); 1591 }else{ 1592 $('#bookmarkBtn').removeClass('button__green'); 1593 $('#bookmarkBtn').addClass('button__gray'); 1594 } 1595 }); 1596</script>
1596 1597 1598 </div> 1599 1600 1601 <div class="article__data"> 1602 <p>Airbnb has redesigned its authentication architecture to make login flows easier to change across Web, iOS, and Android. The new system moves authentication decisions from clients to a server-side policy engine that selects the most appropriate authentication challenge based on the user and session context. According to Airbnb, the redesign reduced authentication-related code by 60%, reduced the web client bundle by 100 KB, increased successful authentication by 2.6%, and reduced duplicate account creation by 27%.</p> 1603 1604<p> </p> 1605 1606<p id="gdcalert1"><img alt="" class="zoom-image" data-src="news/2026/09/airbnb-server-driven-login/en/resources/1identifythenchallenge-1787593686126.jpeg" height="400" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/news/2026/09/airbnb-server-driven-login/en/resources/1identifythenchallenge-1787593686126.jpeg" rel="share"></p> 1607 1608<p><em>Airbnb’s Identify-then-Challenge Architecture (Source: <a href="https://medium.com/airbnb-engineering/flexible-authentication-reimagining-authentication-for-millions-of-users-at-airbnb-3a8a4c917137">Airbnb Blog Post</a>)</em></p> 1609 1610<p>The architecture separates authentication into two stages. First, users identify the account they want to access using an email address, phone number, or social login. The server then evaluates account and session information and uses a configurable policy engine to select the challenge most likely to succeed. Other supported methods are returned as fallback options. For example, the system can prefer WhatsApp OTP for a user in Brazil or a regional identity provider for a user in South Korea.</p> 1611 1612<p><a href="https://www.linkedin.com/in/jmsantos94/">Jose Santos</a>, an engineer at Airbnb, <a href="https://www.linkedin.com/posts/jmsantos94_flexible-authentication-reimagining-authentication-activity-7493382955181211649-_xCe?utm_source=share&utm_medium=member_desktop&rcm=ACoAAArnikgBqzTxA9Y838-O55QUcB2McACIq94">explained</a> the user problem behind the redesign:</p> 1613 1614<blockquote> 1615<p>People don’t always remember how they created an account months or years ago. They may have changed devices, lost access to a phone number, or be using a different login method in another region. Authentication needs to adapt.</p> 1616</blockquote> 1617 1618<p>A key architectural change is that clients no longer determine which authentication challenge to present. The server makes that decision, while the client renders the screen the server returns. This allows Airbnb to change authentication strategies by region or experiment without shipping new client code.</p> 1619 1620<p>Airbnb introduced a server-driven Challenge Picker to help users recover from authentication failures without restarting the flow. Each challenge includes a Try another way option, while the server returns ranked alternatives based on previously successful methods, registered authentication methods, and platform availability.</p> 1621 1622<p><img alt="" class="zoom-image" data-src="news/2026/09/airbnb-server-driven-login/en/resources/1Screenshot 2026-08-24 at 10.50.20â¯AM-1787593878178.png" height="400" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/news/2026/09/airbnb-server-driven-login/en/resources/1Screenshot 2026-08-24 at 10.50.20â¯AM-1787593878178.png" rel="share"></p> 1623 1624<p><em>Server-Driven Authentication Flow (Source: <a href="https://medium.com/airbnb-engineering/flexible-authentication-reimagining-authentication-for-millions-of-users-at-airbnb-3a8a4c917137">Airbnb Blog Post</a>)</em></p> 1625 1626<p>The company extended the server-driven model across signup and login. Identifier entry, authentication challenges, account selection, and error handling are represented as server-defined screens. Web, iOS, and Android clients render these screens and return user actions to the server. Server-side schemas also generate client type definitions and help detect mismatches during development.</p> 1627 1628<p>Moving authentication flow logic to the server changed Airbnb’s experimentation cycle. The company ran more than 20 experiments during the first three months after launch, with experiments that did not require client changes moving from idea to measured result in days rather than weeks.</p> 1629 1630<p>The redesign also covered regional authentication methods, returning user flows, loading states, and error handling. <a href="https://lnkd.in/p/gQ8gG8Tc">According</a> to Airbnb lead experience designer <a href="https://www.linkedin.com/in/chloefan/">Chloe Fan</a>, an initial minimalist version reduced engagement because it was too easy to dismiss, prompting further experimentation and refinement.</p> 1631 1632<p>Airbnb reports a 2.6% increase in successful authentication, a 27% reduction in duplicate account creation, and an approximately 11% reduction in OTP costs. The architecture allows Airbnb to continue changing authentication methods and flow logic without embedding those decisions in individual clients.</p> 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 <div class="author-section-full"> <!-- main wrapper for authors section --> 1646 <h2>About the Author</h2> <!-- section title --> 1647 1648 1649 1650 1651 1652 <div class="author" data-id="author-Leela-Kumili"> <!-- main wrapper for each author --> 1653 <a href="/profile/Leela-Kumili/" class="avatar author__avatar" aria-label="Leela Kumili"> </a> 1654 <div class="content-author"> 1655 <h4><strong>Leela Kumili</strong></h4> 1656 <div class="show-author-bio"> 1657 <p> 1658 <!-- author bio will be inserted by frontend --> 1659 </p>
1660 <span> 1661 <div class="icon button-icon icon__plus-circle"></div><span class="show-more">Show more</span><span class="show-less">Show less</span> 1662 </span> 1663 </div> 1664 </div> 1665 </div> 1666 1667 </div> 1668 1669 </div> 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698<input type="hidden" name="" value="Thank you for your review!" id="cr_messages_submitSuccess"/> 1699 1700<input type="hidden" name="" value="Rating is required" id="cr_messages_ratingRequired"/> 1701 1702<input type="hidden" name="" value="Airbnb Cuts Authentication Code by 60% with Server Driven Architecture" id="cr_item_title"/> 1703 1704<input type="hidden" name="" value="Leela Kumili" id="cr_item_author"/> 1705 1706<input type="hidden" name="" value="http://www.infoq.com/news/2026/09/airbnb-server-driven-login/" id="cr_item_url"/> 1707 1708<input type="hidden" name="" value="news" id="cr_item_ctype"/> 1709 1710<input type="hidden" name="" value="en" id="cr_item_lang"/> 1711 1712<input type="hidden" name="" value="1788532200000" id="cr_item_published_time"/> 1713 1714<input type="hidden" name="" value="2498" id="cr_item_primary_topic"/> 1715
1716<script type="text/javascript"> 1717 ContentRating.readMessages(); 1718 ContentRating.readContentItem(); 1719</script>
1719 1720<form class="box__border box form rate contentRatingWidget"> 1721 <h3 class="heading">Rate this Article</h3> 1722 <div class="criterias"> 1723 <div class="crit" id="relevance_fieldset"> 1724 <div class="crit__name">Adoption</div> 1725 <span class="stars"> 1726 <input type="radio" id="relevance-star5" name="rating-relevance" value="5" /><label class="star" for="relevance-star5" title="Innovator"></label> 1727 <input type="radio" id="relevance-star4" name="rating-relevance" value="4" /><label class="star" for="relevance-star4" title="Early adopter"></label> 1728 <input type="radio" id="relevance-star3" name="rating-relevance" value="3" /><label class="star" for="relevance-star3" title="Early majority"></label> 1729 <input type="radio" id="relevance-star2" name="rating-relevance" value="2" /><label class="star" for="relevance-star2" title="Late majority"></label> 1730 <input type="radio" id="relevance-star1" name="rating-relevance" value="1" /><label class="star" for="relevance-star1" title="Laggards"></label> 1731 </span> 1732 <span class="stars__total"></span> 1733 </div> 1734 <div class="crit" id="style_fieldset"> 1735 <div class="crit__name">Style</div> 1736 <span class="stars"> 1737 <input type="radio" id="style-star5" name="rating-style" value="5" /><label class="star" for="style-star5" title="Exceptional"></label> 1738 <input type="radio" id="style-star4" name="rating-style" value="4" /><label class="star" for="style-star4" title="Good"></label> 1739 <input type="radio" id="style-star3" name="rating-style" value="3" /><label class="star" for="style-star3" title="Average"></label> 1740 <input type="radio" id="style-star2" name="rating-style" value="2" /><label class="star" for="style-star2" title="Acceptable"></label> 1741 <input type="radio" id="style-star1" name="rating-style" value="1" /><label class="star" for="style-star1" title="Poor"></label> 1742 </span> 1743 <span class="stars__total"></span> 1744 </div> 1745 </div> 1746</form> 1747 1748<div class="reviews tabs contentRatingWidget"> 1749 <div id="editorReview" class="tab" data-title="Editor Review"> 1750 <form class="box__border form contentRatingWidget" onsubmit="return false;"> 1751 <span class="field input__textarea" aria-required="false"> 1752 <textarea id="editor_input" placeholder="Click to leave your review..." name="textarea" value="" class="field__input"></textarea> 1753 <p class="input__message field__desc serverCallFeedback"></p> 1754 </span> 1755 <input class="button button__large submit_rating" type="submit" value="Submit"/> 1756 </form> 1757 </div> 1758 1759 <div id="chiefEditorReview" class="tab" data-title="Chief Editor Action"> 1760 <form class="box__border form contentRatingWidget" onsubmit="return false;"> 1761 <span class="field input__textarea"> 1762 <textarea id="chiefEditor_input" placeholder="Chief Editor action..." value="" class="field__input"></textarea> 1763 <p class="input__message field__desc serverCallFeedback"></p> 1764 </span> 1765 1766 <div class="actions"> 1767 <div class="actions__left"> 1768 <input class="button button__large submit_rating" type="submit" value="Submit"/> 1769 </div> 1770 <div class="actions__right"> 1771 <span class="field input__checkbox input--small"> 1772 <input type="checkbox" id="auth-checkbox" /> 1773 <label class="label" for="auth-checkbox"><span></span> Author Contacted</label> 1774 </span> 1775 </div> 1776 </div> 1777 </form> 1778 </div> 1779</div> 1780
1781<script type="text/javascript"> 1782 if (!InfoQConstants.editorUser || InfoQConstants.editorUser == 'false') { 1783 $('.contentRatingWidget').remove(); 1784 } else { 1785 1786 if (InfoQConstants.chiefEditor !== 'undefined' && InfoQConstants.chiefEditor == 'false') { 1787 $('#chiefEditorReview').remove(); 1788 } 1789 } 1790</script>
1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800<div class="widget article__fromTopic topics"> 1801 1802 <div class="widget__head related__for-topic" data-id="3686" data-trk-ref="content_primary_topic"> 1803 <h4 class="heading related__heading"> 1804 1805 1806 1807 This content is in the <a href='/scalability/'>Scalability</a> topic 1808 </h4> 1809 </div> 1810 1811 <h5 class="heading related__inline">Related Topics:</h5> 1812 <ul class="no-style topics related__topics topics__small" data-trk-ref="content_related_topic"> 1813 1814 1815 1816 1817 1818 1819 <li data-id="6815"> 1820 <a href="/development/" class="button related__topic button__small button__black">Development</a> 1821 </li> 1822 1823 1824 1825 1826 1827 <li data-id="6816"> 1828 <a href="/architecture-design/" class="button related__topic button__small button__black">Architecture & Design</a> 1829 </li> 1830 1831 1832 1833 1834 1835 1836 1837 1838 <li data-id="728"> 1839 <a href="/rule_engines/" class="button related__topic button__small button__black">Rule Engines</a> 1840 </li> 1841 1842 1843 1844 1845 1846 <li data-id="3889"> 1847 <a href="/identity_mgmt/" class="button related__topic button__small button__black">Identity Management</a> 1848 </li> 1849 1850 1851 1852 1853 1854 <li data-id="18414"> 1855 <a href="/evolutionary-architecture/" class="button related__topic button__small button__black">Evolutionary Architecture</a> 1856 </li> 1857 1858 1859 1860 1861 1862 <li data-id="1009"> 1863 <a href="/GUI/" class="button related__topic button__small button__black">GUI</a> 1864 </li> 1865 1866 1867 1868 1869 1870 <li data-id="5998"> 1871 <a href="/Experiment_Driven_Development/" class="button related__topic button__small button__black">Experiment Driven Development</a> 1872 </li> 1873 1874 1875 1876 1877 1878 <li data-id="7420"> 1879 <a href="/Web_1/" class="button related__topic button__small button__black">Web</a> 1880 </li> 1881 1882 1883 1884 1885 1886 <li data-id="6516"> 1887 <a href="/Mobile-Development/" class="button related__topic button__small button__black">Mobile Development</a> 1888 </li> 1889 1890 1891 1892 1893 1894 <li data-id="6137"> 1895 <a href="/Distributed_Systems/" class="button related__topic button__small button__black">Distributed Systems</a> 1896 </li> 1897 1898 1899 1900 1901 1902 <li data-id="6280"> 1903 <a href="/Web_Applications/" class="button related__topic button__small button__black">Web Applications</a> 1904 </li> 1905 1906 1907 1908 1909 1910 <li data-id="43"> 1911 <a href="/policy/" class="button related__topic button__small button__black">policy</a> 1912 </li> 1913 1914 1915 1916 1917 1918 <li data-id="3686"> 1919 <a href="/scalability/" class="button related__topic button__small button__black">Scalability</a> 1920 </li> 1921 1922 1923 1924 1925 1926 <li data-id="7051"> 1927 <a href="/sweng/" class="button related__topic button__small button__black">Software Engineering</a> 1928 </li> 1929 1930 1931 1932 1933 1934 <li data-id="1358"> 1935 <a href="/ux/" class="button related__topic button__small button__black">User Experience</a> 1936 </li> 1937 1938 1939 1940 1941 1942 <li data-id="5951"> 1943 <a href="/Authentication/" class="button related__topic button__small button__black">Authentication</a> 1944 </li> 1945 1946 1947 1948 1949 1950 <li data-id="15696"> 1951 <a href="/Mobile-Apps/" class="button related__topic button__small button__black">Mobile Apps</a> 1952 </li> 1953 1954 1955 1956 1957 1958 <li data-id="1389"> 1959 <a href="/architecture/" class="button related__topic button__small button__black">Architecture</a> 1960 </li> 1961 1962 1963 </ul> 1964</div> 1965 1966 </div> 1967 <div id="zoom-container"></div> 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978
1979<script type="text/javascript"> 1980 var uriMapping = "news"; 1981 var showVcr = "true"; 1982 var fillWithVcr = "false"; 1983 var sponsorshipsJson = "{"links":null}"; 1984 var sponsoredLinks = $.parseJSON($("<div/>").html(sponsorshipsJson).text()).links; 1985 var numberOfSponsoredVcrIds = sponsoredLinks != null ? sponsoredLinks.length : 0; 1986 1987 var maxItems = 5 - numberOfSponsoredVcrIds; 1988 var displayWidget = false; 1989 var intervalVcrSponsorEditorial = setInterval(function() { 1990 if (window.vcrsLoaded) { 1991 clearInterval(intervalVcrSponsorEditorial); 1992 if(showVcr || fillWithVcr) { 1993 if(fillWithVcr) { 1994 for(var index in window.vcrList) { 1995 if(VCR.isVcrSponsored(sponsoredLinks, window.vcrList[index])) { 1996 VCR.addToExcludedList(window.vcrList[index]); 1997 } 1998 } 1999 } 2000 var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, maxItems, false, null); 2001 if (vcrs != null && vcrs.length > 0 || (sponsoredLinks != null && sponsoredLinks.length > 0)) { 2002 VCR.addToExcludedList(vcrs); 2003 getCommonElements(vcrs, uriMapping, "BOTTOM"); 2004 $('.related__group').find(".rvc__list").css("display", "block"); 2005 displayWidget = true; 2006 } else { 2007 $('.related__group').find(".rvc__list").parent("li").remove(); 2008 } 2009 } 2010 window.contentVcrFinished = true; 2011 // search for infoq.event.on("contentVcrFinished",... to see how/where it is used 2012 infoq.event.trigger("contentVcrFinished"); 2013 } 2014 }, 200); 2015</script>
2015 2016<input type="hidden" name="" value="2498" id="cont_item_primary_topic"/> 2017 2018 2019 2020
2021<script type="text/javascript"> 2022 $(document).ready(function() { 2023 $.ajax({ 2024 url: "/api/recommendationlinks.action", 2025 contentType: "application/x-www-form-urlencoded; charset=utf-8", 2026 type: 'POST', 2027 data: { 2028 "primaryTopicAlias": "architecture-design", 2029 "topicIds": "724,1103,6923,757,1861,2938,2283,1964,2090,40,996,2616,869,1818,4345,876", 2030 "title": "Airbnb Cuts Authentication Code by 60% with Server Driven Architecture", 2031 "contentPath": "/news/2026/09/airbnb-server-driven-login", 2032 "language": "en" 2033 }, 2034 success: displayRelatedEditorial, 2035 async: false 2036 }); 2037 }); 2038 2039 function displayRelatedEditorial(data) { 2040 $('.related__editorial h4').text("Related Editorial"); 2041 if (data && data.length > 0) { 2042 if(data[0].fromEs) { 2043 //change title and tracking params 2044 var box_title="Architecture & Design"; 2045 //replace html entity since it conflicts with style 2046 box_title=box_title.replace("&","&"); 2047 $('.related__editorial h4').text("Popular in " + box_title); 2048 } 2049 for (var i = 0; i < data.length; i++) { 2050 if (i === 5) { 2051 break; 2052 } 2053 if (data[i].url.indexOf("/news/2026/09/airbnb-server-driven-login") !== -1) { 2054 console.log("Removing the current item from list..."); 2055 continue; 2056 } 2057 var theLinkURL = data[i].url; 2058 if(!theLinkURL.endsWith("/")) { 2059 theLinkURL = theLinkURL + "/"; 2060 } 2061 var link = $('<li><h5 class="rvc__title"><a title="" href="' + theLinkURL + '">' + data[i].title + '</a></h5></li>'); 2062 $('.related__editorial ul').append(link); 2063 } 2064 $('.related__editorial').show(); 2065 displayWidget = true; 2066 }else{ 2067 $('.related__editorial').parent("li").remove(); 2068 } 2069 2070 if(displayWidget==true){ 2071 $('.related__group').attr("data-cols", $('.related__group').find(">li").length); 2072 $('.related__group').css("display", "flex"); 2073 } 2074 } 2075</script>
2075 2076 2077<ul class="no-style related__group nocontent cards"> 2078 <li> 2079 <div class="related__editorial"> 2080 <h4 class="heading">Related Editorial</h4> 2081 <ul></ul> 2082 </div> 2083 </li> 2084 <li> 2085 <ul class="no-style rvc__list f_rvcbox" data-place="BOTTOM" data-trk-view="true" data-trk-impr="true" 2086 2087 2088 style="display: none" 2089 2090 > 2091 <h4 class="heading">Related Sponsors</h4> 2092 2093 <div class="f_rvcList"></div> 2094 2095 2096 2097 </ul> 2098 </li> 2099 2100 2101 2102 2103 <li class="bg-gray is-movable"> 2104 <div class="related__prsp"> 2105 <h4 class="heading">Popular across InfoQ</h4> 2106 <ul> 2107 2108 <li> 2109 <h5 class="rvc__title"> 2110 2111 <a href="/news/2026/09/cloudflare-emdash-migration/" class="rvc__link"> 2112 Cloudflare Details its Migration to "WordPress Successor" EmDash 2113 </a> 2114 </h5> 2115 </li> 2116 2117 <li> 2118 <h5 class="rvc__title"> 2119 2120 <a href="/news/2026/09/vercel-scriptc-node/" class="rvc__link"> 2121 Vercel Labs Ships scriptc, a TypeScript-to-Native Compiler That Leaves the JavaScript Engine behind 2122 </a> 2123 </h5> 2124 </li> 2125 2126 <li> 2127 <h5 class="rvc__title"> 2128 2129 <a href="/news/2026/09/c-rust-rewrite/" class="rvc__link"> 2130 Google Rewrites Critical C Dependencies to Rust Using AI and Differential Fuzzing 2131 </a> 2132 </h5> 2133 </li> 2134 2135 <li> 2136 <h5 class="rvc__title"> 2137 2138 <a href="/news/2026/09/canvas-ui-webgl/" class="rvc__link"> 2139 Canvas UI Ships 35 HTML-in-Canvas Components That Run WebGL and WebGPU Effects over Live DOM 2140 </a> 2141 </h5> 2142 </li> 2143 2144 <li> 2145 <h5 class="rvc__title"> 2146 2147 <a href="/podcasts/enterprise-adoption-open-source-sovereignty/" class="rvc__link"> 2148 The Future of AI: from Enterprise Adoption to Open Source Sovereignty 2149 </a> 2150 </h5> 2151 </li> 2152 2153 <li> 2154 <h5 class="rvc__title"> 2155 2156 <a href="/news/2026/09/aws-stateless-mcp/" class="rvc__link"> 2157 Stateless MCP Removes Session Affinity Requirements for AWS Server Deployments 2158 </a> 2159 </h5> 2160 </li> 2161 2162 </ul> 2163 </div> 2164 </li> 2165 2166 2167</ul> 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 </div> 2197 <div class="column article__more f_article_rightbar" data-col="2/6"> 2198 2199 2200 2201 2202 2203 2204
2205<script type="text/javascript"> 2206 window.finishedRightbarVcr = false; 2207 2208 var _gaq = _gaq || []; 2209 var recomJson ="[{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/decision-models-agentic-ai/en/smallimage/alex-porcelli-thumbnail-1789021621084.jpeg","topicsIds":null,"date":1789383600000,"contentType":"presentations","url":"/presentations/decision-models-agentic-ai","title":"Decision Models in Agentic Architectures: from Production to Agent Skills","authorsList":["Alex Porcelli"],"itemPath":"/presentations/decision-models-agentic-ai","score":75201},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/multi-region-latency-cost-tradeoffs/en/smallimage/multi-region-latency-cost-tradeoffs-thumbnail-1783416229477.jpg","topicsIds":null,"date":1783674000000,"contentType":"articles","url":"/articles/multi-region-latency-cost-tradeoffs","title":"Trade-Offs in Multi-Region Architectures: Latency vs. Cost","authorsList":["Uttara Asthana"],"itemPath":"/articles/multi-region-latency-cost-tradeoffs","score":55401},{"imageStoragePath":null,"topicsIds":null,"date":1790035020000,"contentType":"news","url":"/news/2026/09/native-deferred-html-streaming","title":"Out-of-Order HTML Streaming Moves from JS Frameworks into the Browser","authorsList":["Bruno Couriol"],"itemPath":"/news/2026/09/native-deferred-html-streaming","score":181},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/gcp-wif-scale/en/smallimage/gcp-wif-scale-thumbnail-1787838950646.jpg","topicsIds":null,"date":1788174000000,"contentType":"articles","url":"/articles/gcp-wif-scale","title":"Eliminating Long-Lived Credentials in GCP with Workload Identity Federation","authorsList":["Shijin Nair"],"itemPath":"/articles/gcp-wif-scale","score":142},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/aws-multi-region-signing/en/smallimage/aws-multi-region-signing-thumbnail-1783602485181.jpg","topicsIds":null,"date":1783940400000,"contentType":"articles","url":"/articles/aws-multi-region-signing","title":"Removing a Hidden Round Trip from a Multi-Region AWS API","authorsList":["Suresh Gururajan"],"itemPath":"/articles/aws-multi-region-signing","score":112},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/metrics-driven-approach-ios-performance/en/smallimage/metrics-driven-approach-ios-performance-thumbnail-1777624958302.jpg","topicsIds":null,"date":1778058000000,"contentType":"articles","url":"/articles/metrics-driven-approach-ios-performance","title":"Beyond the Benchmark: a Metrics-Driven Approach to Sustained iOS Performance on Real Devices","authorsList":["Vasuki Uday Kiran Vudathala"],"itemPath":"/articles/metrics-driven-approach-ios-performance","score":100},{"imageStoragePath":null,"topicsIds":null,"date":1790603700000,"contentType":"news","url":"/news/2026/09/meta-zgateway-zippydb-proxy","title":"Metaâs ZGateway Cuts ZippyDB Connections 19x While Handling 1B+ Operations per Second","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/meta-zgateway-zippydb-proxy","score":39},{"imageStoragePath":null,"topicsIds":null,"date":1790169720000,"contentType":"news","url":"/news/2026/09/cloudflare-dns-cache","title":"
2209Cloudflare Cuts 100 TB of Memory from 1.1.1.1 DNS Cache","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/cloudflare-dns-cache","score":37},{"imageStoragePath":null,"topicsIds":null,"date":1790001420000,"contentType":"news","url":"/news/2026/09/uber-m3db-subcluster-sharding","title":"Uber Redesigns M3DB Sharding with Subclusters to Limit Failure Impact","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/uber-m3db-subcluster-sharding","score":36},{"imageStoragePath":null,"topicsIds":null,"date":1789136220000,"contentType":"news","url":"/news/2026/09/netflix-conductor-4-workflow","title":"Netflix Reworks Conductor for 420 Million Monthly Workflow Executions and 10X Larger Workflows","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/netflix-conductor-4-workflow","score":32},{"imageStoragePath":null,"topicsIds":null,"date":1788789960000,"contentType":"news","url":"/news/2026/09/netflix-flink-autoscaler","title":"Netflix Moves toward Open Source Flink Autoscaler for 30,000+ Streaming Jobs","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/netflix-flink-autoscaler","score":31},{"imageStoragePath":null,"topicsIds":null,"date":1790776020000,"contentType":"news","url":"/news/2026/09/cursor-continuity-git-storage","title":"Cursor Uses S3 WAL to Scale Git Storage to More than 300 Pushes per Second","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/cursor-continuity-git-storage","score":20},{"imageStoragePath":null,"topicsIds":null,"date":1790341080000,"contentType":"news","url":"/news/2026/09/aws-stateless-mcp","title":"Stateless MCP Removes Session Affinity Requirements for AWS Server Deployments","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/aws-stateless-mcp","score":18},{"imageStoragePath":null,"topicsIds":null,"date":1789569720000,"contentType":"news","url":"/news/2026/09/dropbox-riviera-ai-platform","title":"Dropbox Evolves Riviera Content Processing Platform to Support AI Workloads","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/dropbox-riviera-ai-platform","score":18},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/ai-agent-harness/en/smallimage/vino-thumbnail-1789631870270.jpeg","topicsIds":null,"date":1789988400000,"contentType":"presentations","url":"/presentations/ai-agent-harness","title":"The Agent Harness: Control Planes, Invariants, and Approval Boundaries for Production AI Agents","authorsList":["Vinoth Govindarajan"],"itemPath":"/presentations/ai-agent-harness","score":17},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/minibooks/architect-sociotechnical-craft/en/smallimage/thumb-1787566215701.jpg","topicsIds":null,"date":1787311800000,"contentType":"minibooks","url":"/minibooks/architect-sociotechnical-craft","title":"Architecture as a Socio-Technical Craft","authorsList":["InfoQ"],"itemPath":"/minibooks/architect-sociotechnical-craft","score":17},{"imageStoragePath":null,"topicsIds":null,"date":1789393680000,"contentType":"news","url":"/news/2026/09/agoda-price-cache-dragonflydb","title":"Agoda Replaces 72-Shard SQL Server Price Cache with DragonflyDB","authorsList":["Leela Kumili"],"itemPath":"/news/2026/09/agoda-price-cache-dragonflydb","score":16},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/ai-agents-improve-software-architecture/en/smallimage/ai-agents-improve-software-architecture-thumbnail-1
2209790153650841.jpg","topicsIds":null,"date":1790593200000,"contentType":"articles","url":"/articles/ai-agents-improve-software-architecture","title":"Five Ways To Use AI Coding Agents to Improve Your Software Architecture","authorsList":["Pierre Pureur","Kurt Bittner","Todd Miller"],"itemPath":"/articles/ai-agents-improve-software-architecture","score":15},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/netflix-commerce-architecture-evolution/en/smallimage/kasia-trapszo-thumbnail-1787217920531.jpg","topicsIds":null,"date":1787914800000,"contentType":"presentations","url":"/presentations/netflix-commerce-architecture-evolution","title":"From DVDs to Global Streaming: How Netflixâs Commerce Architecture Actually Evolved","authorsList":["Kasia Trapszo"],"itemPath":"/presentations/netflix-commerce-architecture-evolution","score":14},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/cd-reliability-innovation/en/smallimage/ian-nowland-thumbn
2209ail-1787217621961.jpg","topicsIds":null,"date":1787664840000,"contentType":"presentations","url":"/presentations/cd-reliability-innovation","title":"Continuous Delivery for Foundational Platforms","authorsList":["Ian Nowland"],"itemPath":"/presentations/cd-reliability-innovation","score":13},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/progressive-collapse-system-resilience/en/smallimage/sam-newman-thumbnail-1785845419904.jpg","topicsIds":null,"date":1787137200000,"contentType":"presentations","url":"/presentations/progressive-collapse-system-resilience","title":"Understanding Progressive Collapse: How To Avoid A Cascading Failure","authorsList":["Sam Newman"],"itemPath":"/presentations/progressive-collapse-system-resilience","score":13},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/agentic-fitness-functions-evolutionary-architecture/en/smallimage/thumbnail-1786428822427.jpg","topicsIds":null,"date":1786964400000,"contentType":"articles","url":"/articles/agentic-fitness-functions-evolutionary-architecture","title":"Agentic Fitness Functions: Extending Evolutionary Architecture Beyond Deterministic Rules","authorsList":["Hemant Kumar Mahato","Åukasz Sieczkowski","Vijayasenthilkumar Kuppusamy"],"itemPath":"/articles/agentic-fitness-functions-evolutionary-architecture","score":13},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/system-comprehension-evolutionary-architecture/en/smallimage/thumbnail-1786087830832.jpg","topicsIds":null,"date":1786359600000,"contentType":"articles","url":"/articles/system-comprehension-evolutionary-architecture","title":"Comprehension as an Architectural Characteristic: A System That Is Not Understood Cannot Evolve Safely","authorsList":["Jacobus Meintjes","Narayana Rengaswamy","Paul Katsande","Sureshbabu Bikki"],"itemPath":"/articles/system-comprehension-evolutionary-architecture","score":12},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/evolutionary-architecture-change-locality/en/smallimage/evolutionary-architecture-change-locality-thumbnail-1785239081753.jpg","topicsIds":null,"date":1785754800000,"contentType":"articles","url":"/articles/evolutionary-architecture-change-locality","title":"Enabling Evolutionary Architecture through the Preservation of Change Locality","authorsList":["Michael Fischer","Nicholas Lawrence","Monica Karekar"],"itemPath":"/articles/evolutionary-architecture-change-locality","score":12},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/disaggregation-industrial-systems/en/smallimage/murat-demirbas-thumbnail-1784809202010.jpg","topicsIds":null,"date":1785419400000,"contentType":"presentations","url":"/presentations/disaggregation-industrial-systems","title":"Parting the Clouds: the Rise of Disaggregated Systems","authorsList":["Murat Demirbas"],"itemPath":"/presentations/disaggregation-industrial-systems","score":12},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/evolutionary-architecture-pattern/en/smallimage/evolutionary-architecture-pattern-thumbn
2209ail-1784798616611.jpg","topicsIds":null,"date":1785150000000,"contentType":"articles","url":"/articles/evolutionary-architecture-pattern","title":"An Evolutionary Architecture Pattern for Managing AIâs Pace of Change","authorsList":["Joe Price","Branimir Äurek","Pavlos Migkiros","Trevor Dearham"],"itemPath":"/articles/evolutionary-architecture-pattern","score":12},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/ai-speed-context-store-architecture/en/smallimage/ai-speed-context-store-architecture-thumbnail-1783673492911.jpg","topicsIds":null,"date":1784019600000,"contentType":"articles","url":"/articles/ai-speed-context-store-architecture","title":"Comprehension at AI Speed: Building a Context Store for Evolutionary Architecture","authorsList":["Stella Berhe","Stephan Bragner","Vikram Maran","Anand Jayaraman"],"itemPath":"/articles/ai-speed-context-store-architecture","score":11},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/adaptive-hedged-requests-p99-latency/en/smallimage/thumbnail-1779785816730.jpg","topicsIds":null,"date":1779958800000,"contentType":"articles","url":"/articles/adaptive-hedged-requests-p99-latency","title":"Stragglers, Not Failures: How Adaptive Hedged Requests Reduce p99 Latency by 74 Percent","authorsList":["Prathamesh Bhope"],"itemPath":"/articles/adaptive-hedged-requests-p99-latency","score":11},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/ai-infrastructure-scaling-architecture/en/smallimage/infoq-live-thumbnail-1782888285223.jpg","topicsIds":null,"date":1782903600000,"contentType":"presentations","url":"/presentations/ai-infrastructure-scaling-architecture","title":"The Infrastructure Challenge behind Production AI","authorsList":["Simerus Mahesh","Alex Infanzon","Meryem Arik","Luca Bianchi","Renato Losio"],"itemPath":"/presentations/ai-infrastructure-scaling-architecture","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/continuous-authorization-cloud/en/smallimage/continuous-authorization-cloud-thumbnail-1781599988842.jpg","topicsIds":null,"date":1781859600000,"contentType":"articles","url":"/articles/continuous-authorization-cloud","title":"Designing Continuous Authorization for Sensitive Cloud Systems","authorsList":["Venkata Nedunoori"],"itemPath":"/articles/continuous-authorization-cloud","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/architectural-change-cases/en/smallimage/architectural-change-cases-thumbnail-1780316814045.jpg","topicsIds":null,"date":1780563600000,"contentType":"articles","url":"/articles/architectural-change-cases","title":"Architectural Change Cases: a Practical Tool for Evolutionary Architectures","authorsList":["Pierre Pureur","Kurt Bittner"],"itemPath":"/articles/architectural-change-cases","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/realtime-gpu-workloads/en/smallimage/thumbnail-1779194310932.jpg","topicsIds":null,"date":1779786480000,"contentType":"presentations","url":"/presentations/realtime-gpu-workloads","title":"Realtime and Batch Processing of GPU Workloads","authorsList":["Joseph Stein"],"itemPath":"/presentations/realtime-gpu-workloads","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/ai-gateway-scalability/en/smallimage/thumbn
2209ail-1778663382364.jpg","topicsIds":null,"date":1779280800000,"contentType":"presentations","url":"/presentations/ai-gateway-scalability","title":"The AI Gateway: Scaling Centralized Inference across Decentralized Teams","authorsList":["Meryem Arik"],"itemPath":"/presentations/ai-gateway-scalability","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/ai-large-scale-engineering-systems/en/smallimage/thumbnail-1778069080461.jpeg","topicsIds":null,"date":1778850000000,"contentType":"presentations","url":"/presentations/ai-large-scale-engineering-systems","title":"Using AI as a Thinking Partner for Large-Scale Engineering Systems","authorsList":["Julie Qiu"],"itemPath":"/presentations/ai-large-scale-engineering-systems","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/minibooks/architecting-autonomy/en/smallimage/emag-124-Architecting-Autonomy-thumb-image-1778565056506.jpg","topicsIds":null,"date":1778842800000,"contentType":"minibooks","url":"/minibooks/architecting-autonomy","title":"Architecting Autonomy: Decentralising Architecture Inside an Organization","authorsList":["InfoQ"],"itemPath":"/minibooks/architecting-autonomy","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/platform-reliability-cycle/en/smallimage/platform-reliability-cycle-thumbnail-1777467114542.jpg","topicsIds":null,"date":1777971600000,"contentType":"articles","url":"/articles/platform-reliability-cycle","title":"Three Pillars of Platform Engineering: a Virtuous Cycle","authorsList":["Pratik Agarwal"],"itemPath":"/articles/platform-reliability-cycle","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/human-scalability/en/smallimage/CharlottedeJongSchouwenburg-thumbnail-1776859417660.jpeg","topicsIds":null,"date":1777898400000,"contentType":"presentations","url":"/presentations/human-scalability","title":"The Human Scalability Problem: Why Your Teams Donât Scale Like Your Code","authorsList":["Charlotte de Jong Schouwenburg"],"itemPath":"/presentations/human-scalability","score":10},{"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/latency-techniques/en/smallimage/amir-langer-thumbnail-1774444318217.jpg","topicsIds":null,"date":1775831280000,"contentType":"presentations","url":"/presentations/latency-techniques","title":"Latency: the Race to Zero...Are We There Yet?","authorsList":["Amir Langer"],"itemPath":"/presentations/latency-techniques","score":10},{"imageStoragePath":null,"topicsIds":null,"date":1790836260000,"contentType":"news","url":"/news/2026/10/container-apps-express-sandboxes","title":"Container Apps Express Reaches GA on a Newly Generally Available Sandbox Layer","authorsList":["Steef-Jan Wiggers"],"itemPath":"/news/2026/10/container-apps-express-sandboxes","score":2},{"imageStoragePath":null,"topicsIds":null,"date":1790663580000,"contentType":"news","url":"/news/2026/09/cloudflare-python-workers-ga","title":"Python Workers Reach GA on Cloudflare, with Questions About Cold Starts and Upstream Maintenance","authorsList":["Steef-Jan Wiggers"],"itemPath":"/news/2026/09/cloudflare-python-workers-ga","score":1}]"; 2210 var whitepaperVcrsJson = null; 2211 var topicSponsorshipJson = ""; 2212 var vcrOptionalListJson = null; 2213 /* do not delete these two, as they are used further in the code */ 2214 var contentDatetimeFormat='MMM dd, yyyy'; 2215 var contentUriMapping="news"; 2216 JSi18n.relatedRightbar_relatedContent='Related Content'; 2217 JSi18n.relatedRightbar_sponsoredContent='Related Sponsors'; 2218 JSi18n.relatedRightbar_sponsoredBy='Sponsored by'; 2219 2220 var topicIds = "724,1103,6923,757,1861,2938,2283,1964,2090,40,996,2616,869,1818,4345,876"; 2221 var communityIds = "2497,2498"; 2222 var company = ""; 2223 2224 2225 // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...) 2226 var canStartTrackingCustomRightbar = false;
2227 infoq.event.on('loaded', function(e) { 2228 canStartTrackingCustomRightbar = true; 2229 }); 2230 2231 var intervalRightbar = setInterval(function() { 2232 if (window.vcrsLoaded) { 2233 clearInterval(intervalRightbar); 2234 if(company != null && company != "") { 2235 whitepaperVcrsJson = VCR.filterByCompany(company, window.vcrList); 2236 } else { 2237 whitepaperVcrsJson = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 5, false, null); 2238 } 2239 vcrOptionalListJson = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 10, true, null); 2240 2241 VCR.displayCustomRightbar(recomJson, whitepaperVcrsJson, topicSponsorshipJson); 2242 VCR.displayCustomRightbarOptionalVcrWidget(vcrOptionalListJson); 2243 2244 window.finishedRightbarVcr = true; 2245 } 2246 }, 200); 2247 2248 // these two events can happen one before another async(no precedence any can be first or second). Make sure tracking starts when both happened 2249 var intervalTrackingRightbar = setInterval(function() { 2250 if(canStartTrackingCustomRightbar && window.finishedRightbarVcr){ 2251 clearInterval(intervalTrackingRightbar); 2252 VCR.doTrackingCustomRightbar(); 2253 } 2254 }, 200); 2255 2256 2257</script>
2257 2258<noscript> 2259<div class="widget related__content article__widget"> 2260 <h3 class="widget__heading">Related Content</h3> 2261 <ul class="no-style cards" data-horizontal="true" data-size="xs" data-tax=""> 2262 2263 2264 </ul> 2265</div> 2266</noscript> 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276<div class="newsletter widget" data-bg="infoq"> 2277 <h3 class="heading"><strong>The InfoQ</strong> Newsletter</h3> 2278 <p class="intro"> 2279 A round-up of last week’s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers. 2280 2281 <a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a> 2282 2283 2284 </p> 2285 <div class="newsletter__subscribe"> 2286 <form class="form gdpr" id="floatingNewsletterForm" action="#" onsubmit="floatingNewsletterForm.saveSubscription(); return false;"> 2287 <div class="field input__text input__no-label input__medium newsletter__mail email"> 2288 <label class="field__label label" for="email-newsletter-infoq-guide">Enter your e-mail address</label> 2289 <input class="field__input input" id="email-newsletter-infoq-guide" placeholder="Enter your e-mail address" type="email"> 2290 <input type="text" name="emailH" id="input_floating_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"> 2291 <input type="hidden" id="floating_fnt" name="fnt" value="EHpIzrADJYuZGDbo"/> 2292 <input type="hidden" id="floatingNewsletterType" name="footerNewsletterType" value="regular"/> 2293 <input type="hidden" id="cmpi_f" name="cmpi" value="1"/> 2294 </div> 2295 <div class="hidden">
2296 <span class="input__select field country"> 2297 <label for="input-floating-newsletter-country" class="label field__label">Select your country</label> 2298 <select id="input-floating-newsletter-country" class="select field__input"> 2299 <option value="" class="select__option">Select a country</option> 2300 </select> 2301 <p class="input__message field__desc"></p> 2302 </span> 2303 <span class="input__checkbox field hidden"> 2304 <input type="checkbox" id="gdpr-consent-simple-floating-nl"> 2305 <label for="gdpr-consent-simple-floating-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> 2306 </span> 2307 </div> 2308 <input class="button button__medium button__yellow" type="submit" role="button" value="Subscribe" onclick="return floatingNewsletterForm.validateEmail('Invalid email address');"> 2309 </form> 2310 <p class="meta"> 2311 <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> 2312 </p> 2313 2314 <span class="success" style="display:none;" id="floatingNewsletterEmailMessage"></span> 2315 </div> 2316</div>
2317<script type="text/javascript"> 2318 var floatingNewsletterForm = new Newsletter('Enter your e-mail address', 2319 'email-newsletter-infoq-guide', 'floatingNewsletterType','floatingNewsletterEmailMessage', 'floating_fnt', 'input_floating_email_h', 'input-floating-newsletter-country','cmpi_f','floating_box'); 2320</script>
2320 2321 2322 </div> 2323 </div> 2324 </div> 2325 </section> 2326 </article> 2327
2328<script type="text/javascript"> 2329 // global vars that can be used for this page, us ethis section to add more. 2330 var contentTitle = "Airbnb Cuts Authentication Code by 60% with Server Driven Architecture", 2331 contentPath = "/news/2026/09/airbnb-server-driven-login", 2332 contentUUID = "c3412ae7-ff99-4fcd-8ad0-a6adcedabb04", 2333 authorUserCSVIds = "126665386"; 2334</script>
vendor: 1 bytes, line 2334
2334
2335<script src="https://cdn.infoq.com/statics_s1_20260930115701/scripts/prism-build.js"></script>
vendor: 1 bytes, line 2335
2335
2336<script src="https://cdn.infoq.com/statics_s1_20260930115701/scripts/lib/MathJax/MathJax.js?config=TeX-AMS_HTML"></script>
2336 2337 2338 </main> 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349<footer class="footer "> 2350 2351 2352 <section data-nosnippet class="section container"> 2353 <div class="container__inner"> 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364<ul data-cols="5" class="no-style columns boxes topic__boxes"> 2365 2366 <li class="development"> 2367 <div class="box__header"> 2368 2369 <a class="t_all_footer_more-boxes-header" href="/development/">Development</a> 2370 </div> 2371 <div class="box__content"> 2372 <ul class="no-style box__list small"> 2373 2374 <li> 2375 2376 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/agentic-refactoring-case-study/" title="Agents Refactor 300K Lines in Three Weeks, and Practitioners Ask What It Proves">Agents Refactor 300K Lines in Three Weeks, and Practitioners Ask What It Proves</a></h5> 2377 </li> 2378 2379 <li> 2380 2381 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/cloudflare-http-vary/" title="Cloudflare Adds Configurable HTTP Vary Header Support to Prevent Cache Thrashing">Cloudflare Adds Configurable HTTP Vary Header Support to Prevent Cache Thrashing</a></h5> 2382 </li> 2383 2384 <li> 2385 2386 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/radicle-network-vulnerabilities/" title="Radicle Discloses Critical Flaws Exposing Private Repositories in Plain Text">Radicle Discloses Critical Flaws Exposing Private Repositories in Plain Text</a></h5> 2387 </li> 2388 2389 </ul> 2390 </div> 2391 </li> 2392 2393 <li class="architecture-design"> 2394 <div class="box__header"> 2395 2396 <a class="t_all_footer_more-boxes-header" href="/architecture-design/">Architecture & Design</a> 2397 </div> 2398 <div class="box__content"> 2399 <ul class="no-style box__list small"> 2400 2401 <li> 2402 2403 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/cursor-continuity-git-storage/" title="Cursor Uses S3 WAL to Scale Git Storage to More than 300 Pushes per Second">Cursor Uses S3 WAL to Scale Git Storage to More than 300 Pushes per Second</a></h5> 2404 </li> 2405 2406 <li> 2407 2408 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/meta-zgateway-zippydb-proxy/" title="Meta&rsquo;s ZGateway Cuts ZippyDB Connections 19x While Handling 1B+ Operations per Second">Meta’s ZGateway Cuts ZippyDB Connections 19x While Handling 1B+ Operations per Second</a></h5> 2409 </li> 2410 2411 <li> 2412 2413 <h5><a class="t_all_footer_more-boxes-item" href="/articles/ai-agents-improve-software-architecture/" title="Five Ways To Use AI Coding Agents to Improve Your Software Architecture">Five Ways To Use AI Coding Agents to Improve Your Software Architecture</a></h5> 2414 </li> 2415 2416 </ul> 2417 </div> 2418 </li> 2419 2420 <li class="culture-methods"> 2421 <div class="box__header"> 2422 2423 <a class="t_all_footer_more-boxes-header" href="/culture-methods/">Culture & Methods</a> 2424 </div> 2425 <div class="box__content"> 2426 <ul class="no-style box__list small"> 2427 2428 <li> 2429 2430 <h5><a class="t_all_footer_more-boxes-item" href="/presentations/staff-founder-lessons/" title="From Staff Platform Engineer to a16z Founder: What I Wish I'd Known">From Staff Platform Engineer to a16z Founder: What I Wish I'd Known</a></h5> 2431 </li> 2432 2433 <li> 2434 2435 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/high-performing-teams-program/" title="InfoQ Launc
2435hes High-Performing Teams Certification Program">InfoQ Launches High-Performing Teams Certification Program</a></h5> 2436 </li> 2437 2438 <li> 2439 2440 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/collaborative-platform-culture/" title="Building a Collaborative Platform Culture in a Bank">Building a Collaborative Platform Culture in a Bank</a></h5> 2441 </li> 2442 2443 </ul> 2444 </div> 2445 </li> 2446 2447 <li class="ai-ml-data-eng"> 2448 <div class="box__header"> 2449 2450 <a class="t_all_footer_more-boxes-header" href="/ai-ml-data-eng/">AI, ML & Data Engineering</a> 2451 </div> 2452 <div class="box__content"> 2453 <ul class="no-style box__list small"> 2454 2455 <li> 2456 2457 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/onlinecohorts-ai-certifications/" title="InfoQ Online Cohorts Address AI Security and Coding Agent Verification">InfoQ Online Cohorts Address AI Security and Coding Agent Verification</a></h5> 2458 </li> 2459 2460 <li> 2461 2462 <h5><a class="t_all_footer_more-boxes-item" href="/presentations/building-internal-ai-agents/" title="From Consumers to Builders: Turning 200 of our Team into Agent Creators in 2 Weeks">From Consumers to Builders: Turning 200 of our Team into Agent Creators in 2 Weeks</a></h5> 2463 </li> 2464 2465 <li> 2466 2467 <h5><a class="t_all_footer_more-boxes-item" href="/presentations/adaptive-recommendation-systems-architecture/" title="Adaptive Recommenders in the Real World: Inference, Evals, and System Design">Adaptive Recommenders in the Real World: Inference, Evals, and System Design</a></h5> 2468 </li> 2469 2470 </ul> 2471 </div> 2472 </li> 2473 2474 <li class="devops"> 2475 <div class="box__header"> 2476 2477 <a class="t_all_footer_more-boxes-header" href="/devops/">DevOps</a> 2478 </div> 2479 <div class="box__content"> 2480 <ul class="no-style box__list small"> 2481 2482 <li> 2483 2484 <h5><a class="t_all_footer_more-boxes-item" href="/presentations/context-as-code-devops-agents/" title="Context Is the New Code">Context Is the New Code</a></h5> 2485 </li> 2486 2487 <li> 2488 2489 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/kubernetes-gpu-metrics/" title="Kubernetes Teams Get a Safer Way to See Their Own GPU Metrics">Kubernetes Teams Get a Safer Way to See Their Own GPU Metrics</a></h5> 2490 </li> 2491 2492 <li> 2493 2494 <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/09/atlassian-opentelemetry/" title="Atlassian Rebuilds Metrics Pipeline Around OpenTelemetry at Massive Scale">Atlassian Rebuilds Metrics Pipeline Around OpenTelemetry at Massive Scale</a></h5> 2495 </li> 2496 2497 </ul> 2498 </div> 2499 </li> 2500 2501</ul> 2502 2503 2504 2505 </div> 2506 </section> 2507 <section data-nosnippet class="container section section__newsletter"> 2508 <div class="columns container__inner"> 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527<div class="newsletter" data-col="1/2" 2528 2529 2530 2531 id="infoq-nl" 2532 2533 2534 2535 2536> 2537 <h2 class="heading"> 2538 <strong>The InfoQ</strong> Newsletter 2539 </h2> 2540 <p class="intro">A round-up of last week’s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers. 2541 2542 <a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a> 2543 2544 2545 </p> 2546 <ul class="newsletter__features"> 2547 <li>Get a quick overview of content published on a variety of innovator and early adopter technologies</li> 2548 <li>Learn what you don’t know that you don’t know</li> 2549 <li>Stay up to date with the latest information from the topics you are interested in</li> 2550 </ul> 2551 <div class="newsletter__subscribe"> 2552 <form class="form gdpr" name="footerNewsletterForm" id="footerNewsletterForm" action="#" onsubmit="footerNewsletter.saveSubscription(); return false;"> 2553 <div class="field newsletter__mail input__text input__no-label input__medium email"> 2554 <label for="email-newsletter-infoq" class="label field__label">Enter your e-mail address</label> 2555 <input id="email-newsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/> 2556 <input type="text" name="emailH" id="input_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/> 2557 <input type="hidden" id="fnt" name="fnt" value="EHpIzrADJYuZGDbo"/> 2558 <input type="hidden" id="footerNewsletterType" name="footerNewsletterType" value="regular"/> 2559 <input type="hidden" id="cmpi" name="cmpi" value="1"/> 2560 </div> 2561 <div class="hidden"> 2562 <span class="input__select field country"> 2563 <label for="input-simple-newsletter-country" class="label field__label">Select your country</label> 2564 <select id="input-simple-newsletter-country" class="select field__input"> 2565 <option value="" class="select__option">Select a country</option> 2566 </select> 2567 <p class="input__message field__desc"></p> 2568 </span> 2569 <span class="input__checkbox field hidden"> 2570 <input type="checkbox" id="gdpr-consent-simple-nl"> 2571 <label for="gdpr-consent-simple-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> 2572 </span> 2573 </div> 2574 <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return footerNewsletter.validateEmail('Invalid email address');"/> 2575 </form> 2576 <p class="meta"> 2577 <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> 2578 </p> 2579 2580 <span class="success" style="display:none;" id="footerNewsletterMessage"></span> 2581 </div> 2582
2582<script type="text/javascript"> 2583 var footerNewsletter = new Newsletter('Enter your e-mail address', 2584 'email-newsletter-infoq', 'footerNewsletterType','footerNewsletterMessage', 'fnt', 'input_email_h', 'input-simple-newsletter-country', 'cmpi','footer_except_homepage'); 2585 </script>
2585 2586</div> 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 <div data-col="1/2" data-bg="certification" class="event__container" style="padding-right: 20px;"> 2612 <a href="https://certification.qconferences.com/?utm_source=infoq&utm_medium=referral&utm_campaign=largefooterad_onlinecohorts26" target="_blank" class="qconplus__events-slider" style=""> 2613 <div> 2614 <div class="logo-certification"></div> 2615 </div> 2616 <p class="intro" style="margin-bottom: 0;color: white !important;"> 2617 <b>InfoQ Online Certification Programs</b> 2618 <br>For Senior Engineers, Architects, and Technical Leaders 2619 </p> 2620 <ul style="margin-bottom: 0;"> 2621 <li style="color: white !important;"><b>Architect</b> with Luca Mezzalira | October 9</li> 2622 <li style="color: white !important;"><b>AI Security & Privacy Engineering</b> with Katharine Jarmul | October 14</li> 2623 <li style="color: white !important;"><b>AI-Assisted Engineering</b> with Zichuan Xiong & Premanand Chandrasekaran | October 19</li> 2624 <li style="color: white !important;"><b>High-Performing Teams</b> with Olimpiu Pop | November 17</li> 2625 </ul> 2626 <br> 2627 <p class="intro" style="margin-bottom: 0;color: white !important;">As your role becomes more senior, the work changes. You're no longer just implementing decisions; you're shaping the systems, trade-offs, and technical direction other teams depend on.<br>These 5-week online programs give you a structured way to work through real decisions from your current role with senior peers from other companies.</p> 2628 <strong class="button button__green cta__button">RESERVE YOUR PLACE</strong> 2629 <small style="color: white;"><br>Live online. 4 hours a week, for 5 weeks.</small> 2630 </a> 2631 </div> 2632 2633 2634 2635 2636 2637 2638 </div> 2639 </section> 2640 2641 <section data-nosnippet class="section container footer__subfooter align__left"> 2642 <div class="container__inner columns"> 2643 <div data-col="1/4" class="columns footer__links-wrap"> 2644 <div class="footer__links"> 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654<a href="/" class="nuxt-link-exact-active active" title="Home">Home</a> 2655 2656 2657 <a href="/reginit.action" class="emphasis" title="Create account">Create account</a> 2658 <button aria-label="Log In" class="login" data-ref="mainLogin">Log In</button> 2659 2660 2661<a rel="noreferrer noopener" href="http://qconferences.com/" target="_blank" title="QCon Conferences">QCon Conferences</a> 2662<a rel="noreferrer noopener" href="https://events.infoq.com/" target="_blank">Events</a> 2663 2664 <a href="/write-for-infoq/" title="Write for InfoQ">Write for InfoQ</a> 2665 <a href="/infoq-editors/" title="InfoQ Editors">InfoQ Editors</a> 2666 <a href="/about-infoq/" title="About InfoQ">About InfoQ</a> 2667 <a href="https://c4media.com/" target="_blank" title="About C4Media">About C4Media</a> 2668 2669 <a rel="noreferrer noopener" href="https://get.infoq.com/infoq-mediakit/" title="Media Kit" target="_blank"> 2670 Media Kit 2671 </a> 2672 <a href="https://devmarketing.c4media.com/?utm_source=infoq" title="InfoQ Developer Marketing Blog" target="_blank">InfoQ Developer Marketing Blog</a> 2673 2674 <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> 2675 2676 </div> 2677 2678 </div> 2679 <div data-col="1/4" class="events__list"> 2680 <h4 class="heading footer__heading">Events</h4> 2681 <ul class="qcons__list no-style"> 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 <li><span class="icon event__type conference"></span> 2692 <div class="qcon__detail"> 2693 <h5 class="heading"> 2694 <a rel="noreferrer noopener" href="https://certification.qconferences.com/architecture?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortarchitecture26" target="_blank">Online InfoQ Architect Certification</a> 2695 </h5> 2696 <sp
2696an class="meta date">October 9, 2026</span> 2697 </div> 2698 </li> 2699 <li><span class="icon event__type conference"></span> 2700 <div class="qcon__detail"> 2701 <h5 class="heading"> 2702 <a rel="noreferrer noopener" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortaisecurity26" target="_blank">Online InfoQ AI Security & Privacy Engineering Program</a> 2703 </h5> 2704 <span class="meta date">October 14, 2026</span> 2705 </div> 2706 </li> 2707 <li><span class="icon event__type conference"></span> 2708 <div class="qcon__detail"> 2709 <h5 class="heading"> 2710 <a rel="noreferrer noopener" href="https://certification.qconferences.com/ai-assisted-engineering?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortaiassistedengineering26" target="_blank">Online InfoQ AI-Assisted Engineering Certification</a> 2711 </h5> 2712 <span class="meta date">October 19, 2026</span> 2713 </div> 2714 </li> 2715 <li><span class="icon event__type conference"></span> 2716 <div class="qcon__detail"> 2717 <h5 class="heading"> 2718 <a rel="noreferrer noopener" href="https://certification.qconferences.com/high-performing-teams?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortteams26" target="_blank">Online InfoQ High-Performing Teams Certification</a> 2719 </h5> 2720 <span class="meta date">November 17, 2026</span> 2721 </div> 2722 </li> 2723 <li><span class="icon event__type conference"></span> 2724 <div class="qcon__detail"> 2725 <h5 class="heading"> 2726 <a rel="noreferrer noopener" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qsf26" target="_blank">QCon San Francisco</a> 2727 </h5> 2728 <span class="meta date">November 16-20, 2026</span> 2729 </div> 2730 </li> 2731 <li><span class="icon event__type conference"></span> 2732 <div class="qcon__detail"> 2733 <h5 class="heading"> 2734 <a rel="noreferrer noopener" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qainy26" target="_blank">QCon AI New York</a> 2735 </h5> 2736 <span class="meta date">December 15-16, 2026</span> 2737 </div> 2738 </li> 2739 <li><span class="icon event__type conference"></span> 2740 <div class="qcon__detail"> 2741 <h5 class="heading"> 2742 <a rel="noreferrer noopener" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qlondon27" target="_blank">QCon London 2027</a> 2743 </h5>
2744 <span class="meta date">April 13-16, 2027</span> 2745 </div> 2746 </li> 2747 <li><span class="icon event__type conference"></span> 2748 <div class="qcon__detail"> 2749 <h5 class="heading"> 2750 <a rel="noreferrer noopener" href="https://boston.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qaiboston27" target="_blank">QCon AI Boston</a> 2751 </h5> 2752 <span class="meta date">July 8-9, 2027</span> 2753 </div> 2754 </li> 2755 2756 </ul> 2757 </div> 2758 <div data-col="1/4" class="footer__social-wrap"> 2759 <h4 class="heading text-left footer__heading">Follow us on </h4> 2760 <div class="social__links columns social__links__row"> 2761 2762 2763 <a href="https://www.youtube.com/infoq"><span class="icon icon__large icon__social icon__youtube"></span><div><span class="social__count">Youtube</span><span class="social__followers">232K Followers</span></div></a> 2764 <a href="http://www.linkedin.com/company/infoq"><span class="icon icon__large icon__social icon__linkedin"></span><div><span class="social__count">Linkedin</span><span class="social__followers">26K Followers</span></div></a> 2765 <a rel="noreferrer noopener" href="https://www.instagram.com/infoqdotcom/" target="_blank"><span class="icon icon__large icon__social icon__instagram"></span><div><span class="social__count">Instagram</span><span class="social__followers">New</span></div></a> 2766 <a href="#" id="footerNewsletterRssLink"><span class="icon icon__large icon__social icon__rss"></span><div><span class="social__count">RSS</span><span class="social__followers">19K Readers</span></div></a> 2767 <a rel="noreferrer noopener" href="http://twitter.com/infoq" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span><div><span class="social__count">X</span><span class="social__followers">57.1k Followers</span></div></a> 2768 <a rel="noreferrer noopener" href="https://www.facebook.com/InfoQ-75911537320" target="_blank"><span class="icon icon__large icon__social icon__fb"></span><div><span class="social__count">Facebook</span><span class="social__followers">21K Likes</span></div></a> 2769 <a rel="noreferrer noopener" href="https://bsky.app/profile/infoq.com" target="_blank"><span class="icon icon__large icon__social icon__bluesky"></span><div><span class="social__count">Bluesky</span><span class="social__followers">New</span></div></a> 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 </div> 2790 </div> 2791 <div data-col="1/4" class="footer__stayin-wrap"> 2792 <h4 class="heading text-left footer__heading">Stay in the know</h4> 2793 <div class="stayIn_panel_container"> 2794 <a href="/podcasts/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The InfoQ Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="65px" height="64px" alt="The InfoQ Podcast Logo - Stay in the know"></picture></a> 2795 <a href="/podcasts/#engineering_culture" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>Engineering Culture Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="65px" height="64px" alt="Engineering Culture Podcast Logo - Stay in the knoww"></picture></a> 2796 <a href="/software-architects-newsletter/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The Software Architects' Newsletter</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="65px" height="64px" alt="The Software Architects' Newsletter Logo - Stay in the know"></picture></a> 2797 </div> 2798 </div> 2799 2800 </div> 2801 </section> 2802 <section data-nosnippet class="container footer__bottom section white align__left"> 2803 <div class="container__inner columns"> 2804 <div data-col="2/3" class="column">
2805 <div class="footer__contact contact columns"> 2806 2807 2808 <span data-col="1/6"> 2809 General Feedback 2810 <a href="mailto:[email protected]">[email protected]</a> 2811 </span> 2812 <span data-col="1/6"> 2813 Advertising 2814 <a href="mailto:[email protected]">[email protected]</a> 2815 </span> 2816 <span data-col="1/6"> 2817 Editorial 2818 <a href="mailto:[email protected]">[email protected]</a> 2819 </span> 2820 <span data-col="1/6"> 2821 Marketing 2822 <a href="mailto:[email protected]">[email protected]</a> 2823 </span> 2824 2825 </div> 2826 </div> 2827 <div class="column" data-col="1/3"> 2828 <p class="footer__more"> 2829 InfoQ.com and all content copyright © 2006-2026 C4Media Inc.<br/> 2830 2831 <a href="/privacy-notice" target="_blank">Privacy Notice</a>, <a href="/terms-and-conditions " target="_blank">Terms And Conditions</a>, <a href="/cookie-policy " target="_blank">Cookie Policy</a> 2832 2833 2834 </p> 2835 </div> 2836 </div> 2837 </section> 2838</footer> 2839 <!-- ####### SITE END ######### --> 2840 2841 </div> 2842 2843 2844 2845 <div class="intbt"> 2846 <a href="/int/bt/" title="bt">BT</a> 2847 </div> 2848 2849 2850 2851 2852 2853 2854 2855
2856<script type="text/javascript"> 2857 $.when(humanDetectionAsync()).then( 2858 function(status) { 2859 $.getScript("/scripts/__hd.ifq?hdt=EHpIzrADJYuZGDbo&ha=" + status); 2860 } 2861 ); 2862</script>
vendor: 2 bytes, line 2862
2862
2863<script type="text/javascript"> 2864 2865 var pageFullyLoaded = false; 2866 // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...) 2867 infoq.event.on('loaded', function(e) { 2868 pageFullyLoaded = true; 2869 }); 2870 2871 infoq.event.on('pageWidthChanged', function(e) { 2872 // re-execute tracking vcr impressions when this event happens (it only happens when elements are added/removed from page) 2873 // doTrackVcrImpressions takes into account the data-trk-impr="true" if =false the element was already tracked. 2874 // this is needed when switching from mobile to desktop or when layout on mobile changes and desktop version is displayed. New elements become visible. 2875 Tracker.safeExec(Tracker.doTrackVcrImpressions); 2876 2877 // these 2 need to be called also because we might be on a content page. In case we are not nothing happens 2878 VCR.doTrackingCustomRightbar(); 2879 VCR.doTrackingCustomRightbarForPresentations() 2880 }); 2881 2882 //check to see if error page 2883 if(window.device !== undefined) { 2884 var intervalImpressions = setInterval(function() { 2885 var shouldTrack = false; 2886 2887 // no vcr widgets on index pages 2888 if(window.isIndexPage) { 2889 if(window.sponsoredPodcastDone === undefined || window.sponsoredPodcastDone) { 2890 shouldTrack = true; 2891 } 2892 } else 2893 //on homepage, bottom widget + 2 native widgets 2894 if(InfoQConstants.pageType == "HOMEPAGE" && window.finishedVcrOptional1 && window.finishedRelatedVcr && (window.finishedVcrOptional2 === undefined || window.finishedVcrOptional2)) { 2895 shouldTrack = true; 2896 } else 2897 // rightbar widgets + native widgets + content vcr widgets 2898 if((InfoQConstants.pageType == "NEWS_PAGE" || InfoQConstants.pageType == "ARTICLE_PAGE") 2899 && ((window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) && window.contentVcrFinished)) { 2900 shouldTrack = true; 2901 } else if ((InfoQConstants.pageType == "PRESENTATION_PAGE") 2902 && (window.contentVcrFinished || window.contentVcrFinished === undefined) 2903 && (window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) 2904 ) { 2905 shouldTrack = true; 2906 } else 2907 // native widgets + content widgets 2908 if(window.contentVcrFinished && (window.finishedVcrOptional1 || window.finishedVcrOptional1 === undefined) 2909 && (window.finishedVcrOptional2 || window.finishedVcrOptional2 === undefined)) { 2910 shouldTrack = true; 2911 } 2912 2913 // we start tracking only after the page is fully loaded, frontend signals that they finished everything related to page display. 2914 if(shouldTrack && pageFullyLoaded) { 2915 clearInterval(intervalImpressions); 2916 Tracker.safeExec(Tracker.doTrackVcrImpressions); 2917 2918 // start tracking viewable impressions also only after everything is ready 2919 function callbackRouter(entries, observer) { 2920 var targets = new Array(); 2921 entries.forEach(function (entry) { 2922 var target = entry.target; 2923 if (target.dataset.trkView === 'false') return; 2924 if (entry.intersectionRatio > 0) { 2925 target.dataset.trkView = false; 2926 targets.push(target); 2927 } 2928 }); 2929 Tracker.doTrackViewableImpressions(targets); 2930 } 2931 var elementsForTrackingViewableImpressions = document.querySelectorAll('[data-trk-view="true"]') 2932 var observer = new IntersectionObserver(callbackRouter, { threshold: 0.3 }); 2933 elementsForTrackingViewableImpressions.forEach(observer.observe.bind(observer)); 2934 } 2935 2936 }, 500); 2937 } 2938 $(document).ready(function () { 2939 // desktop notifications widget 2940 Tracker.encodeNotificationLinks($(".f_notificationWidget")); 2941 // mobile notifications widget 2942 Tracker.encodeNotificationLinks($(".h_notifications")); 2943 // desktop notifications page 2944 Tracker.encodeNotificationLinks($(".notification-page")); 2945 // mobile notifications page 2946 Tracker.encodeNotificationLinks($(".notifications_page")); 2947 });
2948</script>
2948 2949 2950 2951 2952 2953 2954 2955
2956<script type="text/javascript"> 2957 if(window.location.hash){ 2958 var hash = window.location.hash.substring(1); 2959 if(hash == 'subscribe'){ 2960 $('html,body').animate({scrollTop: $('.ftxt3 > .newsletter').offset().top}, 'slow'); 2961 } 2962 } 2963</script>
vendor: 1 bytes, line 2963
2963
2964<script type="text/javascript"> 2965 var newsletterSubscriptionURL ='/newsletter/subscribe.action'; 2966 DynamicLinks.updateRssLinks('3405691582'); 2967 2968 ContentSummary.setSelectedTab('en'); 2969 //when user enters the main content area show default topics in the topics bar 2970 $("#content-wrapper").mouseenter(function() { 2971 showDefaultTopics(); 2972 }); 2973 2974 2975 Bookmarks.contentTitle = "Airbnb Cuts Authentication Code by 60% with Server Driven Architecture"; 2976 Bookmarks.apiUrl = '/widgets/bookmark.action'; 2977 Bookmarks.isContentBookmarked = "false"; 2978</script>
vendor: 1 bytes, line 2978
2978
2979<script type="text/javascript"> 2980var $buoop = {vs:{i:6,f:1,o:10.1,s:1}} 2981$buoop.ol = window.onload; 2982$(document).ready(function() { 2983 try {if ($buoop.ol) $buoop.ol();}catch (e) {} 2984 var e = document.createElement("script"); 2985 e.setAttribute("type", "text/javascript"); 2986 e.setAttribute("src", "https://cdn.infoq.com/statics_s1_20260930115701/scripts/lib/browser-update-org/update.js"); 2987 document.body.appendChild(e); 2988}); 2989</script>
2989 2990 2991 2992 2993 2994
2994<script>
vendor: 574 bytes, lines 2994-3003
2994 2995 !function(f,b,e,v,n,t,s) 2996 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 2997 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 2998 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 2999 n.queue=[];t=b.createElement(e);t.async=!0; 3000 t.src=v;s=b.getElementsByTagName(e)[0]; 3001 s.parentNode.insertBefore(t,s)}(window,document,'script', 3002 'https://connect.facebook.net/en_US/fbevents.js'); 3003 fbq('init', '
3003842388869148196
vendor: 58 bytes, lines 3003-3005
3003'); 3004 fbq('track', 'PageView'); 3005
3005</script>
3005 3006 <noscript> 3007 <img height="1" width="1" src="https://www.facebook.com/tr?id=842388869148196&ev=PageView&noscript=1"/> 3008 </noscript> 3009 3010 3011 3012
3012<script type='text/javascript'> 3013 try { 3014 mixpanel.track('page viewed', { 3015 'page name' : document.title, 3016 'url' : window.location.pathname 3017 }); 3018 } 3019 catch(err) { 3020 } 3021 </script>
3021 3022 </body> 3023</html> 3024<!-- s1 -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.