[{"data":1,"prerenderedAt":978},["ShallowReactive",2],{"/blog/expanding-guest-capabilities-in-gitlab-ultimate":3,"navigation-en-us":191,"banner-en-us":619,"footer-en-us":629,"blog-post-authors-en-us-Hannah Sutor":873,"blog-related-posts-en-us-expanding-guest-capabilities-in-gitlab-ultimate":888,"blog-promotions-en-us":914,"next-steps-en-us":968},{"id":4,"title":5,"authors":6,"body":8,"category":169,"date":170,"description":171,"extension":172,"externalUrl":173,"faq":173,"featured":174,"heroImage":175,"meta":176,"navigation":177,"path":178,"seo":179,"slug":183,"stem":184,"tags":185,"template":189,"updatedDate":173,"__hash__":190},"blogPosts/en-us/blog/expanding-guest-capabilities-in-gitlab-ultimate.md","The feature you wanted - Expanded Guest capabilities in GitLab Ultimate",[7],"Hannah Sutor",{"type":9,"value":10,"toc":160},"minimark",[11,27,30,35,44,47,50,54,57,60,75,79,82,90,97,101,104,107,111,119,128,131,137,150],[12,13,14,20,21,26],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://docs.gitlab.com/user/permissions/",[],"Customizable roles"," have been on GitLab's roadmap for the past two years. When we began working on them a year ago, our team struggled to find the ",[15,22,25],{"href":23,"rel":24},"https://handbook.gitlab.com/handbook/product/product-principles/#the-minimal-viable-change-mvc",[],"minimal viable change"," (MVC) that would benefit customers. At the same time, through different feedback channels, customers were telling us they wanted more from their Ultimate tier Guest user roles. There it was: our MVC!",[12,28,29],{},"Here is what happened next.",[31,32,34],"h2",{"id":33},"our-mvc-journey","Our MVC journey",[12,36,37,38,43],{},"When we began working on customizable roles, we knew that the six static, out-of-the-box roles that come with GitLab were not flexible enough to cover the use cases of our customers. Some roles were too permissive, while others didn’t grant the permissions necessary to accomplish a task. At a time when security and abiding by ",[15,39,42],{"href":40,"rel":41},"https://www.techtarget.com/searchsecurity/definition/principle-of-least-privilege-POLP",[],"the principle of least privilege"," is more top of mind than ever, we needed to give our customers a way to define their own roles.",[12,45,46],{},"The customer ask was clear, but the implementation path was not. Performance considerations were top of mind. Permission policies are evaluated when any user action is performed, and we need a secure but scalable way for thousands of users, who may have hundreds of custom roles created, to do their work in GitLab. The team did a lot of technical discovery and performance testing in order to ensure the chosen technical implementation was scalable.",[12,48,49],{},"We decided to start with a very small implementation of custom roles - something that would be meaningful to customers, while also allowing our team to test the new backend implementation that will support custom role creation and usage.",[31,51,53],{"id":52},"how-custom-roles-work","How custom roles work",[12,55,56],{},"For our MVC, we decided that GitLab.com customers with an Ultimate license should be able to create a custom role that is based on the current “Guest” role. They will be able to add one additional permission to the “Guest” role - the ability to view code. This effectively creates a “Guest+1” role. They can then assign this custom role to any existing user.",[12,58,59],{},"Previously, Guests were able to view code on Self-Managed GitLab, and only on internal or public projects. Now, this functionality is available to Guests across the board - in GitLab.com and Self-Managed GitLab, and regardless of project visibility setting. You just need to create and apply the custom Guest role to any user who wishes to view code.",[12,61,62,63,68,69,74],{},"You can read more about how to ",[15,64,67],{"href":65,"rel":66},"https://docs.gitlab.com/user/permissions/#custom-roles",[],"implement this yourself"," and watch a demo ",[15,70,73],{"href":71,"rel":72},"https://docs.gitlab.com/releases/#users-with-the-guest-role-can-view-private-repositories",[],"here",".",[31,76,78],{"id":77},"create-a-custom-role","Create a custom role",[12,80,81],{},"Use the API to create the “Guest+1” custom role. This role will show up as \"Guest - custom\" in the UI, so that it's easy to see which users have this version of the \"Guest\" role assigned.",[12,83,84,85,89],{},"Once the custom role is created, you can ",[15,86,88],{"href":65,"rel":87},[],"use the API"," to associate it to a list of users. Voila! Now, your users have a custom role that allows them to view code as a Guest.",[12,91,92],{},[93,94],"img",{"alt":95,"src":96},"customizable guest role","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398583/blog/Content%20Images/iterating-towards-customizable-roles/guest-custom-role.png",[31,98,100],{"id":99},"why-this-mvc","Why this MVC?",[12,102,103],{},"Sometimes, something is so loud that you’re forced to listen to it. That’s undoubtedly how I felt when I heard the dissatisfaction of our Ultimate customers around Guest users in private projects.",[12,105,106],{},"An unlimited number of Guest users are free with a GitLab Ultimate subscription. However, if the Guest user doesn’t have enough access to really do much within the product, is it really of any value at all? Customers left us a lot of feedback that the low level of privilege the Guest users have for private projects was detrimental to their users' workflows - making those “free” users not actually useful at all. We knew it was time to deliver more value.",[31,108,110],{"id":109},"whats-next","What’s next",[12,112,113,114,118],{},"Our final vision for customizable roles in GitLab is for our users to be able to take what exists today in our ",[15,115,117],{"href":17,"rel":116},[],"permissions table"," and toggle each permission off/on as they please to define a custom role.",[12,120,121,122,127],{},"We plan to start on this by ",[15,123,126],{"href":124,"rel":125},"https://gitlab.com/groups/gitlab-org/-/epics/8914",[],"consolidating"," some of these permissions - both for practical and performance reasons. As you can imagine, some permissions don’t make sense to be toggled “on” if a different feature is “off.\" We will be removing the need for complex logic by consolidating permissions into larger sets that make sense to be enabled/disabled at the same time. This should also translate nicely on the usability side - permutations of 100+ individual permissions would be unwieldy to manage, as a systems administrator, and difficult to understand your role definition, as an end user.",[12,129,130],{},"This update to custom roles is a great example of our iteration value here at GitLab, and I’m most excited about the fact that it’s solving an acute pain point for our Ultimate customers. They deserve to get a lot of value out of their Ultimate subscription, and I am hopeful that an additional permission for Guest users is one way we can increase their value. It’s also a great first step towards our grand customizable roles vision. I hope you’ll give it a try!",[12,132,133],{},[134,135,136],"strong",{},"Check out this demo that shows the customizable guest role in action:",[138,139,142,143],"figure",{"className":140},[141],"video_container","\n  ",[144,145,149],"iframe",{"src":146,"frameBorder":147,"allowFullScreen":148},"https://www.youtube.com/embed/46cp_-Rtxps","0","true"," ",[151,152,153],"blockquote",{},[12,154,155,156,74],{},"Explore the next iteration of ",[15,157,159],{"href":158},"/blog/custom-admin-roles-now-ga/","custom roles",{"title":161,"searchDepth":162,"depth":162,"links":163},"",2,[164,165,166,167,168],{"id":33,"depth":162,"text":34},{"id":52,"depth":162,"text":53},{"id":77,"depth":162,"text":78},{"id":99,"depth":162,"text":100},{"id":109,"depth":162,"text":110},"engineering","2023-03-08","GitLab Ultimate customers can now provide Guests the ability to view code. Learn how to access this new capability.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682652/Blog/Hero%20Images/iterating-cover.jpg",{},true,"/en-us/blog/expanding-guest-capabilities-in-gitlab-ultimate",{"title":5,"description":171,"ogTitle":5,"ogDescription":171,"noIndex":174,"ogImage":175,"ogUrl":180,"ogSiteName":181,"ogType":182,"canonicalUrls":180},"https://about.gitlab.com/blog/expanding-guest-capabilities-in-gitlab-ultimate","https://about.gitlab.com","article","expanding-guest-capabilities-in-gitlab-ultimate","en-us/blog/expanding-guest-capabilities-in-gitlab-ultimate",[186,187,188],"features","collaboration","DevSecOps platform","BlogPost","VtFUpiNidwz1jCmG4Co2t_4GN-8glmII4CTl-Wqiwow",{"logo":192,"freeTrial":197,"sales":202,"login":207,"items":212,"search":539,"minimal":570,"duo":589,"switchNav":598,"pricingDeployment":609},{"config":193},{"href":194,"dataGaName":195,"dataGaLocation":196},"/","gitlab logo","header",{"text":198,"config":199},"Get free trial",{"href":200,"dataGaName":201,"dataGaLocation":196},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":203,"config":204},"Request a demo",{"href":205,"dataGaName":206,"dataGaLocation":196},"/sales/?contact-topic=request-demo","sales",{"text":208,"config":209},"Sign in",{"href":210,"dataGaName":211,"dataGaLocation":196},"https://gitlab.com/users/sign_in/","sign in",[213,242,342,347,461,517],{"text":214,"config":215,"menu":217},"Platform",{"dataNavLevelOne":216},"platform",{"type":218,"columns":219},"cards",[220,226,234],{"title":214,"description":221,"link":222},"The intelligent orchestration platform for DevSecOps",{"text":223,"config":224},"Explore our Platform",{"href":225,"dataGaName":216,"dataGaLocation":196},"/platform/",{"title":227,"description":228,"link":229},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":230,"config":231},"Meet GitLab Duo",{"href":232,"dataGaName":233,"dataGaLocation":196},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":235,"description":236,"link":237},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":238,"config":239},"Learn more",{"href":240,"dataGaName":241,"dataGaLocation":196},"/why-gitlab/","why gitlab",{"text":243,"left":177,"config":244,"menu":246},"Product",{"dataNavLevelOne":245},"solutions",{"type":247,"link":248,"columns":252,"feature":321},"lists",{"text":249,"config":250},"View all Solutions",{"href":251,"dataGaName":245,"dataGaLocation":196},"/solutions/",[253,277,300],{"title":254,"description":255,"link":256,"items":261},"Automation","CI/CD and automation to accelerate deployment",{"config":257},{"icon":258,"href":259,"dataGaName":260,"dataGaLocation":196},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[262,266,269,273],{"text":263,"config":264},"CI/CD",{"href":265,"dataGaLocation":196,"dataGaName":263},"/solutions/continuous-integration/",{"text":227,"config":267},{"href":232,"dataGaLocation":196,"dataGaName":268},"gitlab duo agent platform - product menu",{"text":270,"config":271},"Source Code Management",{"href":272,"dataGaLocation":196,"dataGaName":270},"/solutions/source-code-management/",{"text":274,"config":275},"Automated Software Delivery",{"href":259,"dataGaLocation":196,"dataGaName":276},"Automated software delivery",{"title":278,"description":279,"link":280,"items":285},"Security","Deliver code faster without compromising security",{"config":281},{"href":282,"dataGaName":283,"dataGaLocation":196,"icon":284},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[286,290,295],{"text":287,"config":288},"Application Security Testing",{"href":282,"dataGaName":289,"dataGaLocation":196},"Application security testing",{"text":291,"config":292},"Software Supply Chain Security",{"href":293,"dataGaLocation":196,"dataGaName":294},"/solutions/supply-chain/","Software supply chain security",{"text":296,"config":297},"Software Compliance",{"href":298,"dataGaName":299,"dataGaLocation":196},"/solutions/software-compliance/","software compliance",{"title":301,"link":302,"items":307},"Measurement",{"config":303},{"icon":304,"href":305,"dataGaName":306,"dataGaLocation":196},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[308,312,316],{"text":309,"config":310},"Visibility & Measurement",{"href":305,"dataGaLocation":196,"dataGaName":311},"Visibility and Measurement",{"text":313,"config":314},"Value Stream Management",{"href":315,"dataGaLocation":196,"dataGaName":313},"/solutions/value-stream-management/",{"text":317,"config":318},"Analytics & Insights",{"href":319,"dataGaLocation":196,"dataGaName":320},"/solutions/analytics-and-insights/","Analytics and insights",{"title":322,"type":247,"items":323},"GitLab for",[324,330,336],{"text":325,"config":326},"Enterprise",{"icon":327,"href":328,"dataGaLocation":196,"dataGaName":329},"Building","/enterprise/","enterprise",{"text":331,"config":332},"Small Business",{"icon":333,"href":334,"dataGaLocation":196,"dataGaName":335},"Work","/small-business/","small business",{"text":337,"config":338},"Public Sector",{"icon":339,"href":340,"dataGaLocation":196,"dataGaName":341},"Organization","/solutions/public-sector/","public sector",{"text":343,"config":344},"Pricing",{"href":345,"dataGaName":346,"dataGaLocation":196,"dataNavLevelOne":346},"/pricing/","pricing",{"text":348,"config":349,"menu":351},"Resources",{"dataNavLevelOne":350},"resources",{"type":247,"link":352,"columns":356,"feature":450},{"text":353,"config":354},"View all resources",{"href":355,"dataGaName":350,"dataGaLocation":196},"/resources/",[357,390,417],{"title":358,"items":359},"Getting started",[360,365,370,375,380,385],{"text":361,"config":362},"Install",{"href":363,"dataGaName":364,"dataGaLocation":196},"/install/","install",{"text":366,"config":367},"Quick start guides",{"href":368,"dataGaName":369,"dataGaLocation":196},"/get-started/","quick setup checklists",{"text":371,"config":372},"Learn",{"href":373,"dataGaLocation":196,"dataGaName":374},"https://university.gitlab.com/","learn",{"text":376,"config":377},"Product documentation",{"href":378,"dataGaName":379,"dataGaLocation":196},"https://docs.gitlab.com/","product documentation",{"text":381,"config":382},"Best practice videos",{"href":383,"dataGaName":384,"dataGaLocation":196},"/getting-started-videos/","best practice videos",{"text":386,"config":387},"Integrations",{"href":388,"dataGaName":389,"dataGaLocation":196},"/integrations/","integrations",{"title":391,"items":392},"Discover",[393,398,403,408,412],{"text":394,"config":395},"Customer success stories",{"href":396,"dataGaName":397,"dataGaLocation":196},"/customers/","customer success stories",{"text":399,"config":400},"Blog",{"href":401,"dataGaName":402,"dataGaLocation":196},"/blog/","blog",{"text":404,"config":405},"Demo Hub",{"href":406,"dataGaName":407,"dataGaLocation":196},"/demo-hub/","demo hub",{"text":409,"config":410},"The Source",{"href":411,"dataGaName":402,"dataGaLocation":196},"/the-source/",{"text":413,"config":414},"Remote",{"href":415,"dataGaName":416,"dataGaLocation":196},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":418,"items":419},"Connect",[420,425,430,435,440,445],{"text":421,"config":422},"GitLab Services",{"href":423,"dataGaName":424,"dataGaLocation":196},"/services/","services",{"text":426,"config":427},"Contribute",{"href":428,"dataGaName":429,"dataGaLocation":196},"https://contributors.gitlab.com","contribute",{"text":431,"config":432},"Community",{"href":433,"dataGaName":434,"dataGaLocation":196},"/community/","community",{"text":436,"config":437},"Forum",{"href":438,"dataGaName":439,"dataGaLocation":196},"https://forum.gitlab.com/","forum",{"text":441,"config":442},"Events",{"href":443,"dataGaName":444,"dataGaLocation":196},"/events/","events",{"text":446,"config":447},"Partners",{"href":448,"dataGaName":449,"dataGaLocation":196},"/partners/","partners",{"config":451,"title":454,"text":455,"link":456},{"background":452,"textColor":453},"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":457,"config":458},"Read the latest",{"href":459,"dataGaName":460,"dataGaLocation":196},"/whats-new/","whats new",{"text":462,"config":463,"menu":465},"Company",{"dataNavLevelOne":464},"company",{"type":247,"columns":466},[467],{"items":468},[469,474,480,482,487,492,497,502,507,512],{"text":470,"config":471},"About",{"href":472,"dataGaName":473,"dataGaLocation":196},"/company/","about",{"text":475,"config":476,"footerGa":479},"Jobs",{"href":477,"dataGaName":478,"dataGaLocation":196},"/jobs/","jobs",{"dataGaName":478},{"text":441,"config":481},{"href":443,"dataGaName":444,"dataGaLocation":196},{"text":483,"config":484},"Leadership",{"href":485,"dataGaName":486,"dataGaLocation":196},"/company/team/e-group/","leadership",{"text":488,"config":489},"Handbook",{"href":490,"dataGaName":491,"dataGaLocation":196},"https://handbook.gitlab.com/","handbook",{"text":493,"config":494},"Investor relations",{"href":495,"dataGaName":496,"dataGaLocation":196},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":498,"config":499},"Trust Center",{"href":500,"dataGaName":501,"dataGaLocation":196},"/security/","trust center",{"text":503,"config":504},"AI Transparency Center",{"href":505,"dataGaName":506,"dataGaLocation":196},"/ai-transparency-center/","ai transparency center",{"text":508,"config":509},"Newsletter",{"href":510,"dataGaName":511,"dataGaLocation":196},"/company/contact/#contact-forms","newsletter",{"text":513,"config":514},"Press",{"href":515,"dataGaName":516,"dataGaLocation":196},"/press/","press",{"text":518,"config":519,"menu":520},"Contact us",{"dataNavLevelOne":464},{"type":247,"columns":521},[522],{"items":523},[524,529,534],{"text":525,"config":526},"Talk to sales",{"href":527,"dataGaName":528,"dataGaLocation":196},"/sales/","talk to sales",{"text":530,"config":531},"Support portal",{"href":532,"dataGaName":533,"dataGaLocation":196},"https://support.gitlab.com/hc/en-us","support portal",{"text":535,"config":536},"Customer portal",{"href":537,"dataGaName":538,"dataGaLocation":196},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":540,"login":541,"suggestions":548},"Close",{"text":542,"link":543},"To search repositories and projects, login to",{"text":544,"config":545},"gitlab.com",{"href":210,"dataGaName":546,"dataGaLocation":547},"search login","search",{"text":549,"default":550},"Suggestions",[551,553,557,559,563,567],{"text":227,"config":552},{"href":232,"dataGaName":227,"dataGaLocation":547},{"text":554,"config":555},"Code Suggestions (AI)",{"href":556,"dataGaName":554,"dataGaLocation":547},"/solutions/code-suggestions/",{"text":263,"config":558},{"href":265,"dataGaName":263,"dataGaLocation":547},{"text":560,"config":561},"GitLab on AWS",{"href":562,"dataGaName":560,"dataGaLocation":547},"/partners/technology-partners/aws/",{"text":564,"config":565},"GitLab on Google Cloud",{"href":566,"dataGaName":564,"dataGaLocation":547},"/partners/technology-partners/google-cloud-platform/",{"text":568,"config":569},"Why GitLab?",{"href":240,"dataGaName":568,"dataGaLocation":547},{"freeTrial":571,"mobileIcon":576,"desktopIcon":581,"secondaryButton":584},{"text":572,"config":573},"Start free trial",{"href":574,"dataGaName":201,"dataGaLocation":575},"https://gitlab.com/-/trials/new/","nav",{"altText":577,"config":578},"Gitlab Icon",{"src":579,"dataGaName":580,"dataGaLocation":575},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":577,"config":582},{"src":583,"dataGaName":580,"dataGaLocation":575},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":585,"config":586},"Get Started",{"href":587,"dataGaName":588,"dataGaLocation":575},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":590,"mobileIcon":594,"desktopIcon":596},{"text":591,"config":592},"Learn more about GitLab Duo",{"href":232,"dataGaName":593,"dataGaLocation":575},"gitlab duo",{"altText":577,"config":595},{"src":579,"dataGaName":580,"dataGaLocation":575},{"altText":577,"config":597},{"src":583,"dataGaName":580,"dataGaLocation":575},{"button":599,"mobileIcon":604,"desktopIcon":606},{"text":600,"config":601},"/switch",{"href":602,"dataGaName":603,"dataGaLocation":575},"#contact","switch",{"altText":577,"config":605},{"src":579,"dataGaName":580,"dataGaLocation":575},{"altText":577,"config":607},{"src":608,"dataGaName":580,"dataGaLocation":575},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":610,"mobileIcon":615,"desktopIcon":617},{"text":611,"config":612},"Back to pricing",{"href":345,"dataGaName":613,"dataGaLocation":575,"icon":614},"back to pricing","GoBack",{"altText":577,"config":616},{"src":579,"dataGaName":580,"dataGaLocation":575},{"altText":577,"config":618},{"src":583,"dataGaName":580,"dataGaLocation":575},{"title":620,"titleMobile":621,"button":622,"config":627},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":238,"config":623},{"href":624,"dataGaName":625,"dataGaLocation":626},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":628,"disabled":174},"release",{"data":630},{"text":631,"source":632,"edit":638,"contribute":643,"config":648,"items":653,"minimal":862},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":633,"config":634},"View page source",{"href":635,"dataGaName":636,"dataGaLocation":637},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":639,"config":640},"Edit this page",{"href":641,"dataGaName":642,"dataGaLocation":637},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":644,"config":645},"Please contribute",{"href":646,"dataGaName":647,"dataGaLocation":637},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":649,"facebook":650,"youtube":651,"linkedin":652},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[654,701,754,798,830],{"title":343,"links":655,"subMenu":670},[656,660,665],{"text":657,"config":658},"View plans",{"href":345,"dataGaName":659,"dataGaLocation":637},"view plans",{"text":661,"config":662},"Why Premium?",{"href":663,"dataGaName":664,"dataGaLocation":637},"/pricing/premium/","why premium",{"text":666,"config":667},"Why Ultimate?",{"href":668,"dataGaName":669,"dataGaLocation":637},"/pricing/ultimate/","why ultimate",[671],{"title":672,"links":673},"Contact Us",[674,677,679,681,686,691,696],{"text":675,"config":676},"Contact sales",{"href":527,"dataGaName":206,"dataGaLocation":637},{"text":530,"config":678},{"href":532,"dataGaName":533,"dataGaLocation":637},{"text":535,"config":680},{"href":537,"dataGaName":538,"dataGaLocation":637},{"text":682,"config":683},"Status",{"href":684,"dataGaName":685,"dataGaLocation":637},"https://status.gitlab.com/","status",{"text":687,"config":688},"Terms of use",{"href":689,"dataGaName":690,"dataGaLocation":637},"/terms/","terms of use",{"text":692,"config":693},"Privacy statement",{"href":694,"dataGaName":695,"dataGaLocation":637},"/privacy/","privacy statement",{"text":697,"config":698},"Cookie preferences",{"dataGaName":699,"dataGaLocation":637,"id":700,"isOneTrustButton":177},"cookie preferences","ot-sdk-btn",{"title":243,"links":702,"subMenu":710},[703,706],{"text":188,"config":704},{"href":225,"dataGaName":705,"dataGaLocation":637},"devsecops platform",{"text":707,"config":708},"AI-Assisted Development",{"href":232,"dataGaName":709,"dataGaLocation":637},"ai-assisted development",[711],{"title":712,"links":713},"Topics",[714,719,724,729,734,739,744,749],{"text":715,"config":716},"CICD",{"href":717,"dataGaName":718,"dataGaLocation":637},"/topics/ci-cd/","cicd",{"text":720,"config":721},"GitOps",{"href":722,"dataGaName":723,"dataGaLocation":637},"/topics/gitops/","gitops",{"text":725,"config":726},"DevOps",{"href":727,"dataGaName":728,"dataGaLocation":637},"/topics/devops/","devops",{"text":730,"config":731},"Version Control",{"href":732,"dataGaName":733,"dataGaLocation":637},"/topics/version-control/","version control",{"text":735,"config":736},"DevSecOps",{"href":737,"dataGaName":738,"dataGaLocation":637},"/topics/devsecops/","devsecops",{"text":740,"config":741},"Cloud Native",{"href":742,"dataGaName":743,"dataGaLocation":637},"/topics/cloud-native/","cloud native",{"text":745,"config":746},"AI for Coding",{"href":747,"dataGaName":748,"dataGaLocation":637},"/topics/devops/ai-for-coding/","ai for coding",{"text":750,"config":751},"Agentic AI",{"href":752,"dataGaName":753,"dataGaLocation":637},"/topics/agentic-ai/","agentic ai",{"title":755,"links":756},"Solutions",[757,759,761,766,770,773,777,780,782,785,788,793],{"text":287,"config":758},{"href":282,"dataGaName":287,"dataGaLocation":637},{"text":276,"config":760},{"href":259,"dataGaName":260,"dataGaLocation":637},{"text":762,"config":763},"Agile development",{"href":764,"dataGaName":765,"dataGaLocation":637},"/solutions/agile-delivery/","agile delivery",{"text":767,"config":768},"SCM",{"href":272,"dataGaName":769,"dataGaLocation":637},"source code management",{"text":715,"config":771},{"href":265,"dataGaName":772,"dataGaLocation":637},"continuous integration & delivery",{"text":774,"config":775},"Value stream management",{"href":315,"dataGaName":776,"dataGaLocation":637},"value stream management",{"text":720,"config":778},{"href":779,"dataGaName":723,"dataGaLocation":637},"/solutions/gitops/",{"text":325,"config":781},{"href":328,"dataGaName":329,"dataGaLocation":637},{"text":783,"config":784},"Small business",{"href":334,"dataGaName":335,"dataGaLocation":637},{"text":786,"config":787},"Public sector",{"href":340,"dataGaName":341,"dataGaLocation":637},{"text":789,"config":790},"Education",{"href":791,"dataGaName":792,"dataGaLocation":637},"/solutions/education/","education",{"text":794,"config":795},"Financial services",{"href":796,"dataGaName":797,"dataGaLocation":637},"/solutions/finance/","financial services",{"title":348,"links":799},[800,802,804,806,809,811,814,816,818,820,822,824,826,828],{"text":361,"config":801},{"href":363,"dataGaName":364,"dataGaLocation":637},{"text":366,"config":803},{"href":368,"dataGaName":369,"dataGaLocation":637},{"text":371,"config":805},{"href":373,"dataGaName":374,"dataGaLocation":637},{"text":376,"config":807},{"href":378,"dataGaName":808,"dataGaLocation":637},"docs",{"text":399,"config":810},{"href":401,"dataGaName":402,"dataGaLocation":637},{"text":812,"config":813},"What's new",{"href":459,"dataGaName":460,"dataGaLocation":637},{"text":394,"config":815},{"href":396,"dataGaName":397,"dataGaLocation":637},{"text":413,"config":817},{"href":415,"dataGaName":416,"dataGaLocation":637},{"text":421,"config":819},{"href":423,"dataGaName":424,"dataGaLocation":637},{"text":426,"config":821},{"href":428,"dataGaName":429,"dataGaLocation":637},{"text":431,"config":823},{"href":433,"dataGaName":434,"dataGaLocation":637},{"text":436,"config":825},{"href":438,"dataGaName":439,"dataGaLocation":637},{"text":441,"config":827},{"href":443,"dataGaName":444,"dataGaLocation":637},{"text":446,"config":829},{"href":448,"dataGaName":449,"dataGaLocation":637},{"title":462,"links":831},[832,834,836,838,840,842,846,851,853,855,857],{"text":470,"config":833},{"href":472,"dataGaName":464,"dataGaLocation":637},{"text":475,"config":835},{"href":477,"dataGaName":478,"dataGaLocation":637},{"text":483,"config":837},{"href":485,"dataGaName":486,"dataGaLocation":637},{"text":488,"config":839},{"href":490,"dataGaName":491,"dataGaLocation":637},{"text":493,"config":841},{"href":495,"dataGaName":496,"dataGaLocation":637},{"text":843,"config":844},"Sustainability",{"href":845,"dataGaName":843,"dataGaLocation":637},"/sustainability/",{"text":847,"config":848},"Diversity, inclusion and belonging (DIB)",{"href":849,"dataGaName":850,"dataGaLocation":637},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":498,"config":852},{"href":500,"dataGaName":501,"dataGaLocation":637},{"text":508,"config":854},{"href":510,"dataGaName":511,"dataGaLocation":637},{"text":513,"config":856},{"href":515,"dataGaName":516,"dataGaLocation":637},{"text":858,"config":859},"Modern Slavery Transparency Statement",{"href":860,"dataGaName":861,"dataGaLocation":637},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":863},[864,867,870],{"text":865,"config":866},"Terms",{"href":689,"dataGaName":690,"dataGaLocation":637},{"text":868,"config":869},"Cookies",{"dataGaName":699,"dataGaLocation":637,"id":700,"isOneTrustButton":177},{"text":871,"config":872},"Privacy",{"href":694,"dataGaName":695,"dataGaLocation":637},[874],{"id":875,"title":7,"body":173,"config":876,"content":878,"description":173,"extension":882,"meta":883,"navigation":177,"path":884,"seo":885,"stem":886,"__hash__":887},"blogAuthors/en-us/blog/authors/hannah-sutor.yml",{"template":877},"BlogAuthor",{"name":7,"config":879},{"headshot":880,"ctfId":881},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665588/Blog/Author%20Headshots/hsutor-headshot.png","hsutor","yml",{},"/en-us/blog/authors/hannah-sutor",{},"en-us/blog/authors/hannah-sutor","nuFZkrdtQbEDuoEH2cLr0VZVs4lOUVZ4awIWVRcJHxE",[889,898,906],{"title":890,"description":891,"heroImage":892,"category":169,"date":893,"authors":894,"slug":897,"externalUrl":173},"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",[895,896],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":899,"description":900,"heroImage":901,"category":169,"date":902,"authors":903,"slug":905,"externalUrl":173},"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",[904],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":907,"description":908,"heroImage":909,"category":169,"date":910,"authors":911,"slug":913,"externalUrl":173},"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",[912],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":915},[916,930,942,954],{"id":917,"categories":918,"header":920,"text":921,"button":922,"image":927},"ai-modernization",[919],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":923,"config":924},"Get your AI maturity score",{"href":925,"dataGaName":926,"dataGaLocation":402},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":928},{"src":929},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":931,"categories":932,"header":934,"text":921,"button":935,"image":939},"devops-modernization",[933,738],"product","Are you just managing tools or shipping innovation?",{"text":936,"config":937},"Get your DevOps maturity score",{"href":938,"dataGaName":926,"dataGaLocation":402},"/assessments/devops-modernization-assessment/",{"config":940},{"src":941},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":943,"categories":944,"header":946,"text":921,"button":947,"image":951},"security-modernization",[945],"security","Are you trading speed for security?",{"text":948,"config":949},"Get your security maturity score",{"href":950,"dataGaName":926,"dataGaLocation":402},"/assessments/security-modernization-assessment/",{"config":952},{"src":953},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":955,"paths":956,"header":959,"text":960,"button":961,"image":966},"github-azure-migration",[957,958],"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":962,"config":963},"See how GitLab compares to GitHub",{"href":964,"dataGaName":965,"dataGaLocation":402},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":967},{"src":941},{"header":969,"blurb":970,"button":971,"secondaryButton":976},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":972,"config":973},"Get your free trial",{"href":974,"dataGaName":201,"dataGaLocation":975},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":675,"config":977},{"href":527,"dataGaName":206,"dataGaLocation":975},1786803732269]