[{"data":1,"prerenderedAt":1286},["ShallowReactive",2],{"/blog/understanding-and-improving-total-blocking-time":3,"navigation-en-us":498,"banner-en-us":926,"footer-en-us":936,"blog-post-authors-en-us-Jacques Erasmus":1181,"blog-related-posts-en-us-understanding-and-improving-total-blocking-time":1196,"blog-promotions-en-us":1222,"next-steps-en-us":1276},{"id":4,"title":5,"authors":6,"body":8,"category":476,"date":477,"description":478,"extension":479,"externalUrl":480,"faq":480,"featured":481,"heroImage":482,"meta":483,"navigation":484,"path":485,"seo":486,"slug":490,"stem":491,"tags":492,"template":496,"updatedDate":480,"__hash__":497},"blogPosts/en-us/blog/understanding-and-improving-total-blocking-time.md","Total Blocking Time - The metric to know for faster website performance",[7],"Jacques Erasmus",{"type":9,"value":10,"toc":464},"minimark",[11,22,25,34,39,54,58,61,69,76,80,89,110,116,120,123,130,136,139,142,252,255,260,266,272,275,385,389,399,405,408,431,434,442,448],[12,13,14,15,21],"p",{},"Our world overwhelms us with information that is more accessible than ever. The increasing rates of content production and consumption are gifts that keep on giving. We can't seem to keep up with the information thrown at us. We're limited by our cognitive limitations and time constraints, and a ",[16,17,20],"a",{"href":18,"rel":19},"https://www.nature.com/articles/s41467-019-09311-w",[],"recent study"," concluded the result is a shortening of attention spans. Websites are no exception.",[12,23,24],{},"Users who interact with your website want feedback, and want it fast. Preferably immediately! Website performance has become an important factor in keeping users engaged. But how do you measure how unresponsive a page is before it becomes fully interactive?",[12,26,27,28,33],{},"Many ",[16,29,32],{"href":30,"rel":31},"https://web.dev/vitals/",[],"performance metrics"," exist, but this blog post focuses on Total Blocking Time (TBT).",[35,36,38],"h2",{"id":37},"what-is-total-blocking-time","What is Total Blocking Time?",[12,40,41,42,47,48,53],{},"TBT measures the total amount of time tasks were blocking your browser's main thread. This metric represents the total amount of time that a user could not interact with your website. It's measured between ",[16,43,46],{"href":44,"rel":45},"https://web.dev/fcp/",[],"First Contentful Paint (FCP)"," and ",[16,49,52],{"href":50,"rel":51},"https://web.dev/tti/",[],"Time to Interactive (TTI)",", and represents the combined blocking time for all long tasks.",[35,55,57],{"id":56},"what-is-a-long-task","What is a long task?",[12,59,60],{},"A long task is a process that runs on the main thread for longer than 50 milliseconds (ms). After a task starts, a browser can't interrupt it, and a single long-running task can block the main thread. The result: a website that is unresponsive to user input until the task completes.",[12,62,63,64,68],{},"After the first 50 ms, all time spent on a task is counted as ",[65,66,67],"em",{},"blocking time",". This diagram shows five tasks, two of which block the main thread for 140 ms:",[12,70,71],{},[72,73],"img",{"alt":74,"src":75},"A diagram containing five tasks, two of which are blocking the main thread. The TBT for these tasks adds up to 140 ms.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399073/blog/Content%20Images/tbt/tasks_diagram.png",[35,77,79],{"id":78},"how-can-we-measure-tbt","How can we measure TBT?",[12,81,82,83,88],{},"Many tools measure TBT, but here we’ll use ",[16,84,87],{"href":85,"rel":86},"https://developer.chrome.com/docs/devtools/evaluate-performance/",[],"Chrome DevTools"," to analyze runtime performance.",[12,90,91,92,101,102,105,106,109],{},"As an example: We recently improved performance on GitLab's ",[16,93,96,100],{"href":94,"rel":95},"https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml",[],[97,98,99],"strong",{},"View Source"," page",". This screenshot, taken before the performance improvement, shows eight long-running tasks containing a TBT of ",[97,103,104],{},"2388.16 ms",". That's more than ",[97,107,108],{},"two seconds",":",[12,111,112],{},[72,113],{"alt":114,"src":115},"A screenshot indicating that there are eight long-running tasks. The TBT of these tasks adds up to 2388.16 ms.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399072/blog/Content%20Images/tbt/summary_before.png",[35,117,119],{"id":118},"how-can-we-improve-tbt","How can we improve TBT?",[12,121,122],{},"As you might have guessed by now, reducing the time needed to complete long-running tasks reduces TBT.",[12,124,125,126,129],{},"By selecting one of the tasks from the previous screenshot, we can get a breakdown of how the browser executed it. This ",[97,127,128],{},"Bottom-Up"," view shows that much time is spent on rendering content in the Document Object Model (DOM):",[12,131,132],{},[72,133],{"alt":134,"src":135},"A screenshot of the Bottom-Up view of one of tasks from the previous screenshot. It indicates that most of the time is being spent on rendering content in the DOM.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399073/blog/Content%20Images/tbt/task_7_before.png",[12,137,138],{},"This page has a lot of content that is below the fold – not immediately visible. The browser is spending a lot of resources upfront to render content that is not even visible to the user yet!",[12,140,141],{},"So what can we do? Some ideas:",[143,144,145,156,173,187,201],"ul",{},[146,147,148,151],"li",{},[97,149,150],{},"Change the UX.",[143,152,153],{},[146,154,155],{},"Add a Show More button, paging, or virtual scrolling for long lists.",[146,157,158,161,162,167,168],{},[97,159,160],{},"Lazy-load images.","\n(",[16,163,166],{"href":164,"rel":165},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65745",[],"example",")\n",[143,169,170],{},[146,171,172],{},"Lazy-loading images reduces page weight, allowing the browser to spend resources on more important tasks.",[146,174,175,161,178,167,182],{},[97,176,177],{},"Lazy-load long lists.",[16,179,166],{"href":180,"rel":181},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71633",[],[143,183,184],{},[146,185,186],{},"Similar to lazy-loading images, this approach allows the browser to spend resources on more important tasks.",[146,188,189,161,192,167,196],{},[97,190,191],{},"Reduce excessive HTML.",[16,193,166],{"href":194,"rel":195},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65835",[],[143,197,198],{},[146,199,200],{},"For example, when loading large pages consider removing unnecessary content. Or, consider rendering some content (like icons) with CSS instead.",[146,202,203,206],{},[97,204,205],{},"Defer rendering when possible.",[143,207,208,225,236],{},[146,209,210,211,219,220,224],{},"The ",[16,212,215],{"href":213,"rel":214},"https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility",[],[216,217,218],"code",{},"content-visibility: auto;"," CSS property ensures the rendering of off-screen elements (and thus irrelevant to the user) is skipped without affecting the page layout. (",[16,221,166],{"href":222,"rel":223},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67050",[],")",[146,226,210,227,232,233,224],{},[16,228,231],{"href":229,"rel":230},"https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API",[],"Intersection Observer API"," allows you to observe when elements intersect with the viewport. This information can be used to show or hide certain elements. (",[16,234,166],{"href":180,"rel":235},[],[146,237,238,239,247,248,224],{},"The global ",[16,240,243,246],{"href":241,"rel":242},"https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback?qs=requestIdleCallback",[],[216,244,245],{},"requestIdleCallback"," method"," can be used to render content after the browser goes into an idle state.\n(",[16,249,166],{"href":250,"rel":251},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101942/diffs#7eed73783787184e5b1c029b9668e48638f3a6e8_64_78",[],[12,253,254],{},"Frameworks such as VueJS and React are already heavily optimized. However, be mindful of how you use these frameworks to avoid expensive tasks.",[256,257,259],"h3",{"id":258},"change-vuejs-usage-to-improve-tbt","Change VueJS usage to improve TBT",[12,261,262,263,265],{},"This screenshot shows the ",[97,264,128],{}," view of a task. Much of the task time is spent on activities from third-party code in the VueJS framework:",[12,267,268],{},[72,269],{"alt":270,"src":271},"A screenshot of the Bottom-Up view of one of tasks. It indicates that a lot of the time is being spent on activities in the third-party VueJS framework.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399073/blog/Content%20Images/tbt/task_6_before.png",[12,273,274],{},"What improvements can we make?",[143,276,277,294,304,316,334,356],{},[146,278,279,293],{},[97,280,281,282,287,288],{},"Use ",[16,283,286],{"href":284,"rel":285},"https://gitlab.com/gitlab-org/gitlab/-/issues/215365",[],"Server-side rendering (SSR)"," or ",[16,289,292],{"href":290,"rel":291},"https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/101",[],"streaming"," for pages that are sensitive to page load performance.",[146,295,296,303],{},[97,297,298,299,302],{},"If you don't ",[65,300,301],{},"need"," Vue, don't use it.","\nComponent instances are a lot more expensive than using plain DOM nodes. Try to avoid unnecessary component abstractions.",[146,305,306,315],{},[97,307,308,309,314],{},"Optimize component ",[16,310,313],{"href":311,"rel":312},"https://vuejs.org/guide/components/props.html",[],"props",".","\nChild components in Vue update when at least one of their received props are being updated. Analyze the data that you pass to components. You may find that you can avoid unnecessary updates by making changes to your props strategy.",[146,317,318,326],{},[97,319,281,320,325],{},[16,321,324],{"href":322,"rel":323},"https://vuejs.org/api/built-in-directives.html#v-memo",[],"v-memo"," to skip updates.",[143,327,328],{},[146,329,330,331,333],{},"In Vue versions 3.2 and later, ",[216,332,324],{}," enables you to cache parts of your template. The cached template updates and re-renders only if one of its provided dependencies changes.",[146,335,336,344,345,167,349],{},[97,337,281,338,343],{},[16,339,342],{"href":340,"rel":341},"https://vuejs.org/api/built-in-directives.html#v-once",[],"v-once"," for data"," that does not need to be reactive after the initial load.\n(",[16,346,166],{"href":347,"rel":348},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101942",[],[143,350,351],{},[146,352,353,355],{},[216,354,342],{}," ensures the element and component are only rendered once. Any future updates will be skipped.",[146,357,358,361,362],{},[97,359,360],{},"Reduce expensive tasks in your Vue components.","\nEven a small script may take a long time to finish if it’s not optimized enough. Some suggestions:\n",[143,363,364,376],{},[146,365,366,367,372,373,224],{},"By using ",[16,368,370],{"href":241,"rel":369},[],[216,371,245],{}," you can defer the execution of the non-critical tasks. (",[16,374,166],{"href":250,"rel":375},[],[146,377,378,379,384],{},"By executing expensive scripts in ",[16,380,383],{"href":381,"rel":382},"https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers",[],"WebWorkers"," you can unblock the main thread.",[256,386,388],{"id":387},"results-and-methods","Results and methods",[12,390,391,392,395,396,109],{},"By using three of the methods suggested above, we reduced TBT from about ",[97,393,394],{},"3 seconds"," to approximately ",[97,397,398],{},"500 ms",[12,400,401],{},[72,402],{"alt":403,"src":404},"A chart indicating a drop in TBT from ~3 seconds to ~500 milliseconds.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399072/blog/Content%20Images/tbt/chart_after.png",[12,406,407],{},"What did we do?",[143,409,410,419,424],{},[146,411,412,413,418],{},"Deferred rendering by using the ",[16,414,416],{"href":213,"rel":415},[],[216,417,218],{}," CSS property.",[146,420,412,421,314],{},[16,422,231],{"href":229,"rel":423},[],[146,425,426,427,430],{},"Used ",[16,428,342],{"href":340,"rel":429},[]," for content that didn't need to be reactive after rendering.",[12,432,433],{},"Remember, the size of the decrease always depends on how optimized your app already is to begin with.",[12,435,436,437,441],{},"There is a lot more we can do to improve TBT. While the specific approach depends on the app you're optimizing, the general methods discussed here are very effective at finding improvement opportunities in any app. Like most things in life, a series of the smallest changes often yield the biggest impact. So let's ",[16,438,440],{"href":439},"/blog/dont-confuse-these-twelve-shortcuts-with-iteration/","iterate"," together, and adapt to this ever-changing world.",[443,444,445],"blockquote",{},[12,446,447],{},"“Adaptability is the simple secret of survival.” – Jessica Hagedorn",[12,449,450],{},[65,451,452,453,458,459],{},"Cover image by ",[16,454,457],{"href":455,"rel":456},"https://unsplash.com/@growtika?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Growtika"," on ",[16,460,463],{"href":461,"rel":462},"https://unsplash.com/photos/Iqi0Rm6gBkQ?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Unsplash",{"title":465,"searchDepth":466,"depth":466,"links":467},"",2,[468,469,470,471],{"id":37,"depth":466,"text":38},{"id":56,"depth":466,"text":57},{"id":78,"depth":466,"text":79},{"id":118,"depth":466,"text":119,"children":472},[473,475],{"id":258,"depth":474,"text":259},3,{"id":387,"depth":474,"text":388},"engineering","2023-02-14","Learn how to identify and fix some root causes for high Total Blocking Time.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682637/Blog/Hero%20Images/tbt_cover_image.jpg",{},true,"/en-us/blog/understanding-and-improving-total-blocking-time",{"title":5,"description":478,"ogTitle":5,"ogDescription":478,"noIndex":481,"ogImage":482,"ogUrl":487,"ogSiteName":488,"ogType":489,"canonicalUrls":487},"https://about.gitlab.com/blog/understanding-and-improving-total-blocking-time","https://about.gitlab.com","article","understanding-and-improving-total-blocking-time","en-us/blog/understanding-and-improving-total-blocking-time",[493,494,495],"frontend","performance","tutorial","BlogPost","nfL-Aw7DJR8AzFrP-PzQd9ovMSR3luQIoxbXWsRt3t0",{"logo":499,"freeTrial":504,"sales":509,"login":514,"items":519,"search":846,"minimal":877,"duo":896,"switchNav":905,"pricingDeployment":916},{"config":500},{"href":501,"dataGaName":502,"dataGaLocation":503},"/","gitlab logo","header",{"text":505,"config":506},"Get free trial",{"href":507,"dataGaName":508,"dataGaLocation":503},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":510,"config":511},"Request a demo",{"href":512,"dataGaName":513,"dataGaLocation":503},"/sales/?contact-topic=request-demo","sales",{"text":515,"config":516},"Sign in",{"href":517,"dataGaName":518,"dataGaLocation":503},"https://gitlab.com/users/sign_in/","sign in",[520,549,649,654,768,824],{"text":521,"config":522,"menu":524},"Platform",{"dataNavLevelOne":523},"platform",{"type":525,"columns":526},"cards",[527,533,541],{"title":521,"description":528,"link":529},"The intelligent orchestration platform for DevSecOps",{"text":530,"config":531},"Explore our Platform",{"href":532,"dataGaName":523,"dataGaLocation":503},"/platform/",{"title":534,"description":535,"link":536},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":537,"config":538},"Meet GitLab Duo",{"href":539,"dataGaName":540,"dataGaLocation":503},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":542,"description":543,"link":544},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":545,"config":546},"Learn more",{"href":547,"dataGaName":548,"dataGaLocation":503},"/why-gitlab/","why gitlab",{"text":550,"left":484,"config":551,"menu":553},"Product",{"dataNavLevelOne":552},"solutions",{"type":554,"link":555,"columns":559,"feature":628},"lists",{"text":556,"config":557},"View all Solutions",{"href":558,"dataGaName":552,"dataGaLocation":503},"/solutions/",[560,584,607],{"title":561,"description":562,"link":563,"items":568},"Automation","CI/CD and automation to accelerate deployment",{"config":564},{"icon":565,"href":566,"dataGaName":567,"dataGaLocation":503},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[569,573,576,580],{"text":570,"config":571},"CI/CD",{"href":572,"dataGaLocation":503,"dataGaName":570},"/solutions/continuous-integration/",{"text":534,"config":574},{"href":539,"dataGaLocation":503,"dataGaName":575},"gitlab duo agent platform - product menu",{"text":577,"config":578},"Source Code Management",{"href":579,"dataGaLocation":503,"dataGaName":577},"/solutions/source-code-management/",{"text":581,"config":582},"Automated Software Delivery",{"href":566,"dataGaLocation":503,"dataGaName":583},"Automated software delivery",{"title":585,"description":586,"link":587,"items":592},"Security","Deliver code faster without compromising security",{"config":588},{"href":589,"dataGaName":590,"dataGaLocation":503,"icon":591},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[593,597,602],{"text":594,"config":595},"Application Security Testing",{"href":589,"dataGaName":596,"dataGaLocation":503},"Application security testing",{"text":598,"config":599},"Software Supply Chain Security",{"href":600,"dataGaLocation":503,"dataGaName":601},"/solutions/supply-chain/","Software supply chain security",{"text":603,"config":604},"Software Compliance",{"href":605,"dataGaName":606,"dataGaLocation":503},"/solutions/software-compliance/","software compliance",{"title":608,"link":609,"items":614},"Measurement",{"config":610},{"icon":611,"href":612,"dataGaName":613,"dataGaLocation":503},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[615,619,623],{"text":616,"config":617},"Visibility & Measurement",{"href":612,"dataGaLocation":503,"dataGaName":618},"Visibility and Measurement",{"text":620,"config":621},"Value Stream Management",{"href":622,"dataGaLocation":503,"dataGaName":620},"/solutions/value-stream-management/",{"text":624,"config":625},"Analytics & Insights",{"href":626,"dataGaLocation":503,"dataGaName":627},"/solutions/analytics-and-insights/","Analytics and insights",{"title":629,"type":554,"items":630},"GitLab for",[631,637,643],{"text":632,"config":633},"Enterprise",{"icon":634,"href":635,"dataGaLocation":503,"dataGaName":636},"Building","/enterprise/","enterprise",{"text":638,"config":639},"Small Business",{"icon":640,"href":641,"dataGaLocation":503,"dataGaName":642},"Work","/small-business/","small business",{"text":644,"config":645},"Public Sector",{"icon":646,"href":647,"dataGaLocation":503,"dataGaName":648},"Organization","/solutions/public-sector/","public sector",{"text":650,"config":651},"Pricing",{"href":652,"dataGaName":653,"dataGaLocation":503,"dataNavLevelOne":653},"/pricing/","pricing",{"text":655,"config":656,"menu":658},"Resources",{"dataNavLevelOne":657},"resources",{"type":554,"link":659,"columns":663,"feature":757},{"text":660,"config":661},"View all resources",{"href":662,"dataGaName":657,"dataGaLocation":503},"/resources/",[664,697,724],{"title":665,"items":666},"Getting started",[667,672,677,682,687,692],{"text":668,"config":669},"Install",{"href":670,"dataGaName":671,"dataGaLocation":503},"/install/","install",{"text":673,"config":674},"Quick start guides",{"href":675,"dataGaName":676,"dataGaLocation":503},"/get-started/","quick setup checklists",{"text":678,"config":679},"Learn",{"href":680,"dataGaLocation":503,"dataGaName":681},"https://university.gitlab.com/","learn",{"text":683,"config":684},"Product documentation",{"href":685,"dataGaName":686,"dataGaLocation":503},"https://docs.gitlab.com/","product documentation",{"text":688,"config":689},"Best practice videos",{"href":690,"dataGaName":691,"dataGaLocation":503},"/getting-started-videos/","best practice videos",{"text":693,"config":694},"Integrations",{"href":695,"dataGaName":696,"dataGaLocation":503},"/integrations/","integrations",{"title":698,"items":699},"Discover",[700,705,710,715,719],{"text":701,"config":702},"Customer success stories",{"href":703,"dataGaName":704,"dataGaLocation":503},"/customers/","customer success stories",{"text":706,"config":707},"Blog",{"href":708,"dataGaName":709,"dataGaLocation":503},"/blog/","blog",{"text":711,"config":712},"Demo Hub",{"href":713,"dataGaName":714,"dataGaLocation":503},"/demo-hub/","demo hub",{"text":716,"config":717},"The Source",{"href":718,"dataGaName":709,"dataGaLocation":503},"/the-source/",{"text":720,"config":721},"Remote",{"href":722,"dataGaName":723,"dataGaLocation":503},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":725,"items":726},"Connect",[727,732,737,742,747,752],{"text":728,"config":729},"GitLab Services",{"href":730,"dataGaName":731,"dataGaLocation":503},"/services/","services",{"text":733,"config":734},"Contribute",{"href":735,"dataGaName":736,"dataGaLocation":503},"https://contributors.gitlab.com","contribute",{"text":738,"config":739},"Community",{"href":740,"dataGaName":741,"dataGaLocation":503},"/community/","community",{"text":743,"config":744},"Forum",{"href":745,"dataGaName":746,"dataGaLocation":503},"https://forum.gitlab.com/","forum",{"text":748,"config":749},"Events",{"href":750,"dataGaName":751,"dataGaLocation":503},"/events/","events",{"text":753,"config":754},"Partners",{"href":755,"dataGaName":756,"dataGaLocation":503},"/partners/","partners",{"config":758,"title":761,"text":762,"link":763},{"background":759,"textColor":760},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":764,"config":765},"Read the latest",{"href":766,"dataGaName":767,"dataGaLocation":503},"/whats-new/","whats new",{"text":769,"config":770,"menu":772},"Company",{"dataNavLevelOne":771},"company",{"type":554,"columns":773},[774],{"items":775},[776,781,787,789,794,799,804,809,814,819],{"text":777,"config":778},"About",{"href":779,"dataGaName":780,"dataGaLocation":503},"/company/","about",{"text":782,"config":783,"footerGa":786},"Jobs",{"href":784,"dataGaName":785,"dataGaLocation":503},"/jobs/","jobs",{"dataGaName":785},{"text":748,"config":788},{"href":750,"dataGaName":751,"dataGaLocation":503},{"text":790,"config":791},"Leadership",{"href":792,"dataGaName":793,"dataGaLocation":503},"/company/team/e-group/","leadership",{"text":795,"config":796},"Handbook",{"href":797,"dataGaName":798,"dataGaLocation":503},"https://handbook.gitlab.com/","handbook",{"text":800,"config":801},"Investor relations",{"href":802,"dataGaName":803,"dataGaLocation":503},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":805,"config":806},"Trust Center",{"href":807,"dataGaName":808,"dataGaLocation":503},"/security/","trust center",{"text":810,"config":811},"AI Transparency Center",{"href":812,"dataGaName":813,"dataGaLocation":503},"/ai-transparency-center/","ai transparency center",{"text":815,"config":816},"Newsletter",{"href":817,"dataGaName":818,"dataGaLocation":503},"/company/contact/#contact-forms","newsletter",{"text":820,"config":821},"Press",{"href":822,"dataGaName":823,"dataGaLocation":503},"/press/","press",{"text":825,"config":826,"menu":827},"Contact us",{"dataNavLevelOne":771},{"type":554,"columns":828},[829],{"items":830},[831,836,841],{"text":832,"config":833},"Talk to sales",{"href":834,"dataGaName":835,"dataGaLocation":503},"/sales/","talk to sales",{"text":837,"config":838},"Support portal",{"href":839,"dataGaName":840,"dataGaLocation":503},"https://support.gitlab.com/hc/en-us","support portal",{"text":842,"config":843},"Customer portal",{"href":844,"dataGaName":845,"dataGaLocation":503},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":847,"login":848,"suggestions":855},"Close",{"text":849,"link":850},"To search repositories and projects, login to",{"text":851,"config":852},"gitlab.com",{"href":517,"dataGaName":853,"dataGaLocation":854},"search login","search",{"text":856,"default":857},"Suggestions",[858,860,864,866,870,874],{"text":534,"config":859},{"href":539,"dataGaName":534,"dataGaLocation":854},{"text":861,"config":862},"Code Suggestions (AI)",{"href":863,"dataGaName":861,"dataGaLocation":854},"/solutions/code-suggestions/",{"text":570,"config":865},{"href":572,"dataGaName":570,"dataGaLocation":854},{"text":867,"config":868},"GitLab on AWS",{"href":869,"dataGaName":867,"dataGaLocation":854},"/partners/technology-partners/aws/",{"text":871,"config":872},"GitLab on Google Cloud",{"href":873,"dataGaName":871,"dataGaLocation":854},"/partners/technology-partners/google-cloud-platform/",{"text":875,"config":876},"Why GitLab?",{"href":547,"dataGaName":875,"dataGaLocation":854},{"freeTrial":878,"mobileIcon":883,"desktopIcon":888,"secondaryButton":891},{"text":879,"config":880},"Start free trial",{"href":881,"dataGaName":508,"dataGaLocation":882},"https://gitlab.com/-/trials/new/","nav",{"altText":884,"config":885},"Gitlab Icon",{"src":886,"dataGaName":887,"dataGaLocation":882},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":884,"config":889},{"src":890,"dataGaName":887,"dataGaLocation":882},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":892,"config":893},"Get Started",{"href":894,"dataGaName":895,"dataGaLocation":882},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":897,"mobileIcon":901,"desktopIcon":903},{"text":898,"config":899},"Learn more about GitLab Duo",{"href":539,"dataGaName":900,"dataGaLocation":882},"gitlab duo",{"altText":884,"config":902},{"src":886,"dataGaName":887,"dataGaLocation":882},{"altText":884,"config":904},{"src":890,"dataGaName":887,"dataGaLocation":882},{"button":906,"mobileIcon":911,"desktopIcon":913},{"text":907,"config":908},"/switch",{"href":909,"dataGaName":910,"dataGaLocation":882},"#contact","switch",{"altText":884,"config":912},{"src":886,"dataGaName":887,"dataGaLocation":882},{"altText":884,"config":914},{"src":915,"dataGaName":887,"dataGaLocation":882},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":917,"mobileIcon":922,"desktopIcon":924},{"text":918,"config":919},"Back to pricing",{"href":652,"dataGaName":920,"dataGaLocation":882,"icon":921},"back to pricing","GoBack",{"altText":884,"config":923},{"src":886,"dataGaName":887,"dataGaLocation":882},{"altText":884,"config":925},{"src":890,"dataGaName":887,"dataGaLocation":882},{"title":927,"titleMobile":928,"button":929,"config":934},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":545,"config":930},{"href":931,"dataGaName":932,"dataGaLocation":933},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":935,"disabled":481},"release",{"data":937},{"text":938,"source":939,"edit":945,"contribute":950,"config":955,"items":960,"minimal":1170},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":940,"config":941},"View page source",{"href":942,"dataGaName":943,"dataGaLocation":944},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":946,"config":947},"Edit this page",{"href":948,"dataGaName":949,"dataGaLocation":944},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":951,"config":952},"Please contribute",{"href":953,"dataGaName":954,"dataGaLocation":944},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":956,"facebook":957,"youtube":958,"linkedin":959},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[961,1008,1062,1106,1138],{"title":650,"links":962,"subMenu":977},[963,967,972],{"text":964,"config":965},"View plans",{"href":652,"dataGaName":966,"dataGaLocation":944},"view plans",{"text":968,"config":969},"Why Premium?",{"href":970,"dataGaName":971,"dataGaLocation":944},"/pricing/premium/","why premium",{"text":973,"config":974},"Why Ultimate?",{"href":975,"dataGaName":976,"dataGaLocation":944},"/pricing/ultimate/","why ultimate",[978],{"title":979,"links":980},"Contact Us",[981,984,986,988,993,998,1003],{"text":982,"config":983},"Contact sales",{"href":834,"dataGaName":513,"dataGaLocation":944},{"text":837,"config":985},{"href":839,"dataGaName":840,"dataGaLocation":944},{"text":842,"config":987},{"href":844,"dataGaName":845,"dataGaLocation":944},{"text":989,"config":990},"Status",{"href":991,"dataGaName":992,"dataGaLocation":944},"https://status.gitlab.com/","status",{"text":994,"config":995},"Terms of use",{"href":996,"dataGaName":997,"dataGaLocation":944},"/terms/","terms of use",{"text":999,"config":1000},"Privacy statement",{"href":1001,"dataGaName":1002,"dataGaLocation":944},"/privacy/","privacy statement",{"text":1004,"config":1005},"Cookie preferences",{"dataGaName":1006,"dataGaLocation":944,"id":1007,"isOneTrustButton":484},"cookie preferences","ot-sdk-btn",{"title":550,"links":1009,"subMenu":1018},[1010,1014],{"text":1011,"config":1012},"DevSecOps platform",{"href":532,"dataGaName":1013,"dataGaLocation":944},"devsecops platform",{"text":1015,"config":1016},"AI-Assisted Development",{"href":539,"dataGaName":1017,"dataGaLocation":944},"ai-assisted development",[1019],{"title":1020,"links":1021},"Topics",[1022,1027,1032,1037,1042,1047,1052,1057],{"text":1023,"config":1024},"CICD",{"href":1025,"dataGaName":1026,"dataGaLocation":944},"/topics/ci-cd/","cicd",{"text":1028,"config":1029},"GitOps",{"href":1030,"dataGaName":1031,"dataGaLocation":944},"/topics/gitops/","gitops",{"text":1033,"config":1034},"DevOps",{"href":1035,"dataGaName":1036,"dataGaLocation":944},"/topics/devops/","devops",{"text":1038,"config":1039},"Version Control",{"href":1040,"dataGaName":1041,"dataGaLocation":944},"/topics/version-control/","version control",{"text":1043,"config":1044},"DevSecOps",{"href":1045,"dataGaName":1046,"dataGaLocation":944},"/topics/devsecops/","devsecops",{"text":1048,"config":1049},"Cloud Native",{"href":1050,"dataGaName":1051,"dataGaLocation":944},"/topics/cloud-native/","cloud native",{"text":1053,"config":1054},"AI for Coding",{"href":1055,"dataGaName":1056,"dataGaLocation":944},"/topics/devops/ai-for-coding/","ai for coding",{"text":1058,"config":1059},"Agentic AI",{"href":1060,"dataGaName":1061,"dataGaLocation":944},"/topics/agentic-ai/","agentic ai",{"title":1063,"links":1064},"Solutions",[1065,1067,1069,1074,1078,1081,1085,1088,1090,1093,1096,1101],{"text":594,"config":1066},{"href":589,"dataGaName":594,"dataGaLocation":944},{"text":583,"config":1068},{"href":566,"dataGaName":567,"dataGaLocation":944},{"text":1070,"config":1071},"Agile development",{"href":1072,"dataGaName":1073,"dataGaLocation":944},"/solutions/agile-delivery/","agile delivery",{"text":1075,"config":1076},"SCM",{"href":579,"dataGaName":1077,"dataGaLocation":944},"source code management",{"text":1023,"config":1079},{"href":572,"dataGaName":1080,"dataGaLocation":944},"continuous integration & delivery",{"text":1082,"config":1083},"Value stream management",{"href":622,"dataGaName":1084,"dataGaLocation":944},"value stream management",{"text":1028,"config":1086},{"href":1087,"dataGaName":1031,"dataGaLocation":944},"/solutions/gitops/",{"text":632,"config":1089},{"href":635,"dataGaName":636,"dataGaLocation":944},{"text":1091,"config":1092},"Small business",{"href":641,"dataGaName":642,"dataGaLocation":944},{"text":1094,"config":1095},"Public sector",{"href":647,"dataGaName":648,"dataGaLocation":944},{"text":1097,"config":1098},"Education",{"href":1099,"dataGaName":1100,"dataGaLocation":944},"/solutions/education/","education",{"text":1102,"config":1103},"Financial services",{"href":1104,"dataGaName":1105,"dataGaLocation":944},"/solutions/finance/","financial services",{"title":655,"links":1107},[1108,1110,1112,1114,1117,1119,1122,1124,1126,1128,1130,1132,1134,1136],{"text":668,"config":1109},{"href":670,"dataGaName":671,"dataGaLocation":944},{"text":673,"config":1111},{"href":675,"dataGaName":676,"dataGaLocation":944},{"text":678,"config":1113},{"href":680,"dataGaName":681,"dataGaLocation":944},{"text":683,"config":1115},{"href":685,"dataGaName":1116,"dataGaLocation":944},"docs",{"text":706,"config":1118},{"href":708,"dataGaName":709,"dataGaLocation":944},{"text":1120,"config":1121},"What's new",{"href":766,"dataGaName":767,"dataGaLocation":944},{"text":701,"config":1123},{"href":703,"dataGaName":704,"dataGaLocation":944},{"text":720,"config":1125},{"href":722,"dataGaName":723,"dataGaLocation":944},{"text":728,"config":1127},{"href":730,"dataGaName":731,"dataGaLocation":944},{"text":733,"config":1129},{"href":735,"dataGaName":736,"dataGaLocation":944},{"text":738,"config":1131},{"href":740,"dataGaName":741,"dataGaLocation":944},{"text":743,"config":1133},{"href":745,"dataGaName":746,"dataGaLocation":944},{"text":748,"config":1135},{"href":750,"dataGaName":751,"dataGaLocation":944},{"text":753,"config":1137},{"href":755,"dataGaName":756,"dataGaLocation":944},{"title":769,"links":1139},[1140,1142,1144,1146,1148,1150,1154,1159,1161,1163,1165],{"text":777,"config":1141},{"href":779,"dataGaName":771,"dataGaLocation":944},{"text":782,"config":1143},{"href":784,"dataGaName":785,"dataGaLocation":944},{"text":790,"config":1145},{"href":792,"dataGaName":793,"dataGaLocation":944},{"text":795,"config":1147},{"href":797,"dataGaName":798,"dataGaLocation":944},{"text":800,"config":1149},{"href":802,"dataGaName":803,"dataGaLocation":944},{"text":1151,"config":1152},"Sustainability",{"href":1153,"dataGaName":1151,"dataGaLocation":944},"/sustainability/",{"text":1155,"config":1156},"Diversity, inclusion and belonging (DIB)",{"href":1157,"dataGaName":1158,"dataGaLocation":944},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":805,"config":1160},{"href":807,"dataGaName":808,"dataGaLocation":944},{"text":815,"config":1162},{"href":817,"dataGaName":818,"dataGaLocation":944},{"text":820,"config":1164},{"href":822,"dataGaName":823,"dataGaLocation":944},{"text":1166,"config":1167},"Modern Slavery Transparency Statement",{"href":1168,"dataGaName":1169,"dataGaLocation":944},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1171},[1172,1175,1178],{"text":1173,"config":1174},"Terms",{"href":996,"dataGaName":997,"dataGaLocation":944},{"text":1176,"config":1177},"Cookies",{"dataGaName":1006,"dataGaLocation":944,"id":1007,"isOneTrustButton":484},{"text":1179,"config":1180},"Privacy",{"href":1001,"dataGaName":1002,"dataGaLocation":944},[1182],{"id":1183,"title":7,"body":480,"config":1184,"content":1186,"description":480,"extension":1190,"meta":1191,"navigation":484,"path":1192,"seo":1193,"stem":1194,"__hash__":1195},"blogAuthors/en-us/blog/authors/jacques-erasmus.yml",{"template":1185},"BlogAuthor",{"name":7,"config":1187},{"headshot":1188,"ctfId":1189},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682633/Blog/Author%20Headshots/jerasmus-headshot.png","jerasmus","yml",{},"/en-us/blog/authors/jacques-erasmus",{},"en-us/blog/authors/jacques-erasmus","TjV8YmHjrtjtCNLw7qQ-556YJvca-CZOVmsXnq5m8nU",[1197,1206,1214],{"title":1198,"description":1199,"heroImage":1200,"category":476,"date":1201,"authors":1202,"slug":1205,"externalUrl":480},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1203,1204],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1207,"description":1208,"heroImage":1209,"category":476,"date":1210,"authors":1211,"slug":1213,"externalUrl":480},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1212],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1215,"description":1216,"heroImage":1217,"category":476,"date":1218,"authors":1219,"slug":1221,"externalUrl":480},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1220],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1223},[1224,1238,1250,1262],{"id":1225,"categories":1226,"header":1228,"text":1229,"button":1230,"image":1235},"ai-modernization",[1227],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1231,"config":1232},"Get your AI maturity score",{"href":1233,"dataGaName":1234,"dataGaLocation":709},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1236},{"src":1237},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1239,"categories":1240,"header":1242,"text":1229,"button":1243,"image":1247},"devops-modernization",[1241,1046],"product","Are you just managing tools or shipping innovation?",{"text":1244,"config":1245},"Get your DevOps maturity score",{"href":1246,"dataGaName":1234,"dataGaLocation":709},"/assessments/devops-modernization-assessment/",{"config":1248},{"src":1249},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1251,"categories":1252,"header":1254,"text":1229,"button":1255,"image":1259},"security-modernization",[1253],"security","Are you trading speed for security?",{"text":1256,"config":1257},"Get your security maturity score",{"href":1258,"dataGaName":1234,"dataGaLocation":709},"/assessments/security-modernization-assessment/",{"config":1260},{"src":1261},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1263,"paths":1264,"header":1267,"text":1268,"button":1269,"image":1274},"github-azure-migration",[1265,1266],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1270,"config":1271},"See how GitLab compares to GitHub",{"href":1272,"dataGaName":1273,"dataGaLocation":709},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1275},{"src":1249},{"header":1277,"blurb":1278,"button":1279,"secondaryButton":1284},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1280,"config":1281},"Get your free trial",{"href":1282,"dataGaName":508,"dataGaLocation":1283},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":982,"config":1285},{"href":834,"dataGaName":513,"dataGaLocation":1283},1786803776148]