[{"data":1,"prerenderedAt":1107},["ShallowReactive",2],{"/blog/mr-reviews-with-vs-code":3,"navigation-en-us":320,"banner-en-us":747,"footer-en-us":757,"blog-post-authors-en-us-Tomas Vik":1002,"blog-related-posts-en-us-mr-reviews-with-vs-code":1017,"blog-promotions-en-us":1043,"next-steps-en-us":1097},{"id":4,"title":5,"authors":6,"body":8,"category":298,"date":299,"description":300,"extension":301,"externalUrl":302,"faq":302,"featured":303,"heroImage":304,"meta":305,"navigation":306,"path":307,"seo":308,"slug":312,"stem":313,"tags":314,"template":318,"updatedDate":302,"__hash__":319},"blogPosts/en-us/blog/mr-reviews-with-vs-code.md","How to do GitLab merge request reviews in VS Code",[7],"Tomas Vik",{"type":9,"value":10,"toc":291},"minimark",[11,15,25,28,33,47,62,66,86,103,111,114,126,133,137,155,163,166,179,198],[12,13,14],"p",{},"This post will give you an idea of how VS Code can aid your code review process. You'll get an overview of the features that GitLab VS Code Extension currently supports, as well as what we plan to introduce in the future.",[12,16,17,18,24],{},"Reviewing merge requests is a core part of GitLab: both the product (since ",[19,20,23],"a",{"href":21,"rel":22},"https://gitlab.com/gitlab-org/gitlab/blob/6a3621202e3f7274150862198f59d2579c326650/changelogs/archive.md#L7222",[],"version 2.0.0",", released in 2011) and the company. We recognize that certain review tasks are hard to do just by looking at the diff, and we strive to make them easier. One such task might be looking in the codebase for duplicated code or examples of a particular coding style.",[12,26,27],{},"We decided to aid code reviewers in two ways:",[29,30,32],"h2",{"id":31},"first-way-the-gitlab-web-ide","First way: The GitLab Web IDE",[12,34,35,36,40,41,46],{},"First, we introduced the ",[19,37,39],{"href":38},"/blog/introducing-gitlab-s-integrated-development-environment/","Web IDE",", which helps our users work ",[19,42,45],{"href":43,"rel":44},"https://docs.gitlab.com/user/project/web_ide/",[],"with the codebase in the browser",". You can quickly open multiple files, make changes, and commit them. The Web IDE is handy when you need to make a small change, or you don't have the project cloned locally.",[12,48,49,50,61],{},"The second way is more recent. We always wanted to bring the code review experience closer to code editors, where developers spend a large portion of their time. But the editor market is very fragmented (you find out the hard way if Emacs and Vim users meet at a party). And it isn't feasible to build GitLab support into all major editors (however, there are plenty of editor plugins maintained by the community",[51,52,53],"sup",{},[19,54,60],{"href":55,"ariaDescribedBy":56,"dataFootnoteRef":58,"id":59},"#user-content-fn-1",[57],"footnote-label","","user-content-fnref-1","1",").",[29,63,65],{"id":64},"second-way-bringing-code-reviews-into-the-editor","Second way: Bringing code reviews into the editor",[12,67,68,69,74,75,79,80,85],{},"Recently, as ",[19,70,73],{"href":71,"rel":72},"https://insights.stackoverflow.com/survey/2019#development-environments-and-tools",[],"VS Code gained a significant user share",", it started to make sense to ",[19,76,78],{"href":77},"/blog/use-gitlab-with-vscode/","commit to maintaining the GitLab VS Code extension",", which was started as a community project by one, at the time, GitLab employee: ",[19,81,84],{"href":82,"rel":83},"https://gitlab.com/fatihacet",[],"Fatih",". After an initial housekeeping period, we started chipping away tasks that will ultimately bring the code review experience into the editor.",[12,87,88,89,93,94,102],{},"In my previous post I talked about the great ",[19,90,92],{"href":91},"/blog/vscode-extension-development-with-gitlab/","VS Code Extension API",". This API gives extensions almost full control over the editor. When the API introduced commenting functionality two years ago, extensions could start contributing comments to the editor windows. These comments are shown similarly as comments on a Google Doc. Being able to natively show comments is perfect for reviewing code changes in the editor and other extensions that provide code reviews are already using this commenting API",[51,95,96],{},[19,97,101],{"href":98,"ariaDescribedBy":99,"dataFootnoteRef":58,"id":100},"#user-content-fn-2",[57],"user-content-fnref-2","2",".",[12,104,105,110],{},[106,107],"img",{"alt":108,"src":109},"Merge request review in VS Code","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398737/blog/Content%20Images/mr-reviews-with-vs-code/full-mr-review-screen.png","\nMerge request review in VS Code",[12,112,113],{},"Over the last few milestones, we started showing MR changes in VS Code and even showing discussions on these. This means that you can open an MR in your editor and read through the code and comments without switching windows and context. I find this really useful because I can still interact with my editor the way I'm used to, even as I'm reviewing MRs. I can use full-text search to find if the MR duplicates existing code or I can open a different test file and compare whether the code style matches.",[12,115,116,117,125],{},"Currently, the interaction with MR is mostly read-only. That means you can see the changes and discussions, but you can't add or change comments, yet",[51,118,119],{},[19,120,124],{"href":121,"ariaDescribedBy":122,"dataFootnoteRef":58,"id":123},"#user-content-fn-3",[57],"user-content-fnref-3","3",". But even in this current form, you can benefit from having the VS Code functionality so close to your review, especially for the initial understanding of the change.",[12,127,128,132],{},[106,129],{"alt":130,"src":131},"VS Code supports Markdown in the comments","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398738/blog/Content%20Images/mr-reviews-with-vs-code/mr-review-long-comment.png","\nVS Code supports Markdown in the comments",[29,134,136],{"id":135},"whats-next","What's next",[12,138,139,140,148,149,154],{},"Over the next few milestones, we plan to make the commenting as interactive as you know it from the GitLab web interface. We'll start with editing existing comments, adding emoji reactions and resolving discussion threads. Lastly, we'll implement the full review functionality with creating comments and reviews",[51,141,142],{},[19,143,147],{"href":144,"ariaDescribedBy":145,"dataFootnoteRef":58,"id":146},"#user-content-fn-4",[57],"user-content-fnref-4","4",". Each ",[19,150,153],{"href":151,"rel":152},"https://handbook.gitlab.com/handbook/values/#iteration",[],"iteration"," will make the feature a bit more useful.",[12,156,157,158,102],{},"I'm excited about the potential to stay in my editor for both creating and reviewing merge requests. I'm already using the current merge request review feature to get the initial understanding of what the MR tries to achieve. I can explore the related code more quickly in my editor. If you'd like to help us build the code review feature or just look at the current state of development, visit the ",[19,159,162],{"href":160,"rel":161},"https://gitlab.com/groups/gitlab-org/-/epics/4607",[],"Merge Request Review epic",[12,164,165],{},"You can check out a walkthrough our initial proof of concept of merge request reviews in VS Code below:",[167,168,171,172],"figure",{"className":169},[170],"video_container","\n  ",[173,174,178],"iframe",{"src":175,"frameBorder":176,"allowFullScreen":177},"https://www.youtube-nocookie.com/embed/kKA6i8oqZAA","0","true"," ",[12,180,181,186,187,192,193],{},[19,182,185],{"href":183,"rel":184},"https://art.ljubicapetkovic.com/cc-licensed/",[],"Cover image"," by ",[19,188,191],{"href":189,"rel":190},"https://art.ljubicapetkovic.com",[],"Ljubica Petkovic",", licensed under ",[19,194,197],{"href":195,"rel":196},"https://creativecommons.org/licenses/by-sa/4.0/",[],"CC BY-SA 4.0",[199,200,203,208],"section",{"className":201,"dataFootnotes":58},[202],"footnotes",[29,204,207],{"className":205,"id":57},[206],"sr-only","Footnotes",[209,210,211,244,262,271],"ol",{},[212,213,215,220,221,220,226,220,231,236,237],"li",{"id":214},"user-content-fn-1",[19,216,219],{"href":217,"rel":218},"https://plugins.jetbrains.com/plugin/7447-gitlab-integration-plugin",[],"IntelliJ",", ",[19,222,225],{"href":223,"rel":224},"https://atom.io/packages/search?q=gitlab",[],"Atom",[19,227,230],{"href":228,"rel":229},"https://github.com/shumphrey/fugitive-gitlab.vim",[],"vim",[19,232,235],{"href":233,"rel":234},"https://github.com/nlamirault/emacs-gitlab",[],"Emacs",", ... ",[19,238,243],{"href":239,"ariaLabel":240,"className":241,"dataFootnoteBackref":58},"#user-content-fnref-1","Back to reference 1",[242],"data-footnote-backref","↩",[212,245,247,220,252,178,257],{"id":246},"user-content-fn-2",[19,248,251],{"href":249,"rel":250},"https://marketplace.visualstudio.com/items?itemName=Atlassian.atlascode",[],"Jira and Bitbucket",[19,253,256],{"href":254,"rel":255},"https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github",[],"GitHub Pull Requests and Issues",[19,258,243],{"href":259,"ariaLabel":260,"className":261,"dataFootnoteBackref":58},"#user-content-fnref-2","Back to reference 2",[242],[212,263,265,266],{"id":264},"user-content-fn-3","You can work around that by using the MR overview and commenting there. ",[19,267,243],{"href":268,"ariaLabel":269,"className":270,"dataFootnoteBackref":58},"#user-content-fnref-3","Back to reference 3",[242],[212,272,274,279,280,285,286],{"id":273},"user-content-fn-4",[19,275,278],{"href":276,"rel":277},"https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/issues/269",[],"MR review: interacting with existing comments - POC"," and ",[19,281,284],{"href":282,"rel":283},"https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/issues/293",[],"MR review: new comments and reviews POC"," represent the initial investigation. ",[19,287,243],{"href":288,"ariaLabel":289,"className":290,"dataFootnoteBackref":58},"#user-content-fnref-4","Back to reference 4",[242],{"title":58,"searchDepth":292,"depth":292,"links":293},2,[294,295,296,297],{"id":31,"depth":292,"text":32},{"id":64,"depth":292,"text":65},{"id":135,"depth":292,"text":136},{"id":57,"depth":292,"text":207},"engineering","2021-01-25","Code review is critical to modern software development. We're making it easier by bringing merge request reviews right into VS Code.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666775/Blog/Hero%20Images/cover.jpg",{},true,"/en-us/blog/mr-reviews-with-vs-code",{"title":5,"description":300,"ogTitle":5,"ogDescription":300,"noIndex":303,"ogImage":304,"ogUrl":309,"ogSiteName":310,"ogType":311,"canonicalUrls":309},"https://about.gitlab.com/blog/mr-reviews-with-vs-code","https://about.gitlab.com","article","mr-reviews-with-vs-code","en-us/blog/mr-reviews-with-vs-code",[315,316,317],"code review","integrations","tutorial","BlogPost","WBIwCZwqoO0vbZ0XEDo44Dt7KdcGrTIdoz0pB4csGxQ",{"logo":321,"freeTrial":326,"sales":331,"login":336,"items":341,"search":667,"minimal":698,"duo":717,"switchNav":726,"pricingDeployment":737},{"config":322},{"href":323,"dataGaName":324,"dataGaLocation":325},"/","gitlab logo","header",{"text":327,"config":328},"Get free trial",{"href":329,"dataGaName":330,"dataGaLocation":325},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":332,"config":333},"Request a demo",{"href":334,"dataGaName":335,"dataGaLocation":325},"/sales/?contact-topic=request-demo","sales",{"text":337,"config":338},"Sign in",{"href":339,"dataGaName":340,"dataGaLocation":325},"https://gitlab.com/users/sign_in/","sign in",[342,371,471,476,589,645],{"text":343,"config":344,"menu":346},"Platform",{"dataNavLevelOne":345},"platform",{"type":347,"columns":348},"cards",[349,355,363],{"title":343,"description":350,"link":351},"The intelligent orchestration platform for DevSecOps",{"text":352,"config":353},"Explore our Platform",{"href":354,"dataGaName":345,"dataGaLocation":325},"/platform/",{"title":356,"description":357,"link":358},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":359,"config":360},"Meet GitLab Duo",{"href":361,"dataGaName":362,"dataGaLocation":325},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":364,"description":365,"link":366},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":367,"config":368},"Learn more",{"href":369,"dataGaName":370,"dataGaLocation":325},"/why-gitlab/","why gitlab",{"text":372,"left":306,"config":373,"menu":375},"Product",{"dataNavLevelOne":374},"solutions",{"type":376,"link":377,"columns":381,"feature":450},"lists",{"text":378,"config":379},"View all Solutions",{"href":380,"dataGaName":374,"dataGaLocation":325},"/solutions/",[382,406,429],{"title":383,"description":384,"link":385,"items":390},"Automation","CI/CD and automation to accelerate deployment",{"config":386},{"icon":387,"href":388,"dataGaName":389,"dataGaLocation":325},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[391,395,398,402],{"text":392,"config":393},"CI/CD",{"href":394,"dataGaLocation":325,"dataGaName":392},"/solutions/continuous-integration/",{"text":356,"config":396},{"href":361,"dataGaLocation":325,"dataGaName":397},"gitlab duo agent platform - product menu",{"text":399,"config":400},"Source Code Management",{"href":401,"dataGaLocation":325,"dataGaName":399},"/solutions/source-code-management/",{"text":403,"config":404},"Automated Software Delivery",{"href":388,"dataGaLocation":325,"dataGaName":405},"Automated software delivery",{"title":407,"description":408,"link":409,"items":414},"Security","Deliver code faster without compromising security",{"config":410},{"href":411,"dataGaName":412,"dataGaLocation":325,"icon":413},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[415,419,424],{"text":416,"config":417},"Application Security Testing",{"href":411,"dataGaName":418,"dataGaLocation":325},"Application security testing",{"text":420,"config":421},"Software Supply Chain Security",{"href":422,"dataGaLocation":325,"dataGaName":423},"/solutions/supply-chain/","Software supply chain security",{"text":425,"config":426},"Software Compliance",{"href":427,"dataGaName":428,"dataGaLocation":325},"/solutions/software-compliance/","software compliance",{"title":430,"link":431,"items":436},"Measurement",{"config":432},{"icon":433,"href":434,"dataGaName":435,"dataGaLocation":325},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[437,441,445],{"text":438,"config":439},"Visibility & Measurement",{"href":434,"dataGaLocation":325,"dataGaName":440},"Visibility and Measurement",{"text":442,"config":443},"Value Stream Management",{"href":444,"dataGaLocation":325,"dataGaName":442},"/solutions/value-stream-management/",{"text":446,"config":447},"Analytics & Insights",{"href":448,"dataGaLocation":325,"dataGaName":449},"/solutions/analytics-and-insights/","Analytics and insights",{"title":451,"type":376,"items":452},"GitLab for",[453,459,465],{"text":454,"config":455},"Enterprise",{"icon":456,"href":457,"dataGaLocation":325,"dataGaName":458},"Building","/enterprise/","enterprise",{"text":460,"config":461},"Small Business",{"icon":462,"href":463,"dataGaLocation":325,"dataGaName":464},"Work","/small-business/","small business",{"text":466,"config":467},"Public Sector",{"icon":468,"href":469,"dataGaLocation":325,"dataGaName":470},"Organization","/solutions/public-sector/","public sector",{"text":472,"config":473},"Pricing",{"href":474,"dataGaName":475,"dataGaLocation":325,"dataNavLevelOne":475},"/pricing/","pricing",{"text":477,"config":478,"menu":480},"Resources",{"dataNavLevelOne":479},"resources",{"type":376,"link":481,"columns":485,"feature":578},{"text":482,"config":483},"View all resources",{"href":484,"dataGaName":479,"dataGaLocation":325},"/resources/",[486,518,545],{"title":487,"items":488},"Getting started",[489,494,499,504,509,514],{"text":490,"config":491},"Install",{"href":492,"dataGaName":493,"dataGaLocation":325},"/install/","install",{"text":495,"config":496},"Quick start guides",{"href":497,"dataGaName":498,"dataGaLocation":325},"/get-started/","quick setup checklists",{"text":500,"config":501},"Learn",{"href":502,"dataGaLocation":325,"dataGaName":503},"https://university.gitlab.com/","learn",{"text":505,"config":506},"Product documentation",{"href":507,"dataGaName":508,"dataGaLocation":325},"https://docs.gitlab.com/","product documentation",{"text":510,"config":511},"Best practice videos",{"href":512,"dataGaName":513,"dataGaLocation":325},"/getting-started-videos/","best practice videos",{"text":515,"config":516},"Integrations",{"href":517,"dataGaName":316,"dataGaLocation":325},"/integrations/",{"title":519,"items":520},"Discover",[521,526,531,536,540],{"text":522,"config":523},"Customer success stories",{"href":524,"dataGaName":525,"dataGaLocation":325},"/customers/","customer success stories",{"text":527,"config":528},"Blog",{"href":529,"dataGaName":530,"dataGaLocation":325},"/blog/","blog",{"text":532,"config":533},"Demo Hub",{"href":534,"dataGaName":535,"dataGaLocation":325},"/demo-hub/","demo hub",{"text":537,"config":538},"The Source",{"href":539,"dataGaName":530,"dataGaLocation":325},"/the-source/",{"text":541,"config":542},"Remote",{"href":543,"dataGaName":544,"dataGaLocation":325},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":546,"items":547},"Connect",[548,553,558,563,568,573],{"text":549,"config":550},"GitLab Services",{"href":551,"dataGaName":552,"dataGaLocation":325},"/services/","services",{"text":554,"config":555},"Contribute",{"href":556,"dataGaName":557,"dataGaLocation":325},"https://contributors.gitlab.com","contribute",{"text":559,"config":560},"Community",{"href":561,"dataGaName":562,"dataGaLocation":325},"/community/","community",{"text":564,"config":565},"Forum",{"href":566,"dataGaName":567,"dataGaLocation":325},"https://forum.gitlab.com/","forum",{"text":569,"config":570},"Events",{"href":571,"dataGaName":572,"dataGaLocation":325},"/events/","events",{"text":574,"config":575},"Partners",{"href":576,"dataGaName":577,"dataGaLocation":325},"/partners/","partners",{"config":579,"title":582,"text":583,"link":584},{"background":580,"textColor":581},"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":585,"config":586},"Read the latest",{"href":587,"dataGaName":588,"dataGaLocation":325},"/whats-new/","whats new",{"text":590,"config":591,"menu":593},"Company",{"dataNavLevelOne":592},"company",{"type":376,"columns":594},[595],{"items":596},[597,602,608,610,615,620,625,630,635,640],{"text":598,"config":599},"About",{"href":600,"dataGaName":601,"dataGaLocation":325},"/company/","about",{"text":603,"config":604,"footerGa":607},"Jobs",{"href":605,"dataGaName":606,"dataGaLocation":325},"/jobs/","jobs",{"dataGaName":606},{"text":569,"config":609},{"href":571,"dataGaName":572,"dataGaLocation":325},{"text":611,"config":612},"Leadership",{"href":613,"dataGaName":614,"dataGaLocation":325},"/company/team/e-group/","leadership",{"text":616,"config":617},"Handbook",{"href":618,"dataGaName":619,"dataGaLocation":325},"https://handbook.gitlab.com/","handbook",{"text":621,"config":622},"Investor relations",{"href":623,"dataGaName":624,"dataGaLocation":325},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":626,"config":627},"Trust Center",{"href":628,"dataGaName":629,"dataGaLocation":325},"/security/","trust center",{"text":631,"config":632},"AI Transparency Center",{"href":633,"dataGaName":634,"dataGaLocation":325},"/ai-transparency-center/","ai transparency center",{"text":636,"config":637},"Newsletter",{"href":638,"dataGaName":639,"dataGaLocation":325},"/company/contact/#contact-forms","newsletter",{"text":641,"config":642},"Press",{"href":643,"dataGaName":644,"dataGaLocation":325},"/press/","press",{"text":646,"config":647,"menu":648},"Contact us",{"dataNavLevelOne":592},{"type":376,"columns":649},[650],{"items":651},[652,657,662],{"text":653,"config":654},"Talk to sales",{"href":655,"dataGaName":656,"dataGaLocation":325},"/sales/","talk to sales",{"text":658,"config":659},"Support portal",{"href":660,"dataGaName":661,"dataGaLocation":325},"https://support.gitlab.com/hc/en-us","support portal",{"text":663,"config":664},"Customer portal",{"href":665,"dataGaName":666,"dataGaLocation":325},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":668,"login":669,"suggestions":676},"Close",{"text":670,"link":671},"To search repositories and projects, login to",{"text":672,"config":673},"gitlab.com",{"href":339,"dataGaName":674,"dataGaLocation":675},"search login","search",{"text":677,"default":678},"Suggestions",[679,681,685,687,691,695],{"text":356,"config":680},{"href":361,"dataGaName":356,"dataGaLocation":675},{"text":682,"config":683},"Code Suggestions (AI)",{"href":684,"dataGaName":682,"dataGaLocation":675},"/solutions/code-suggestions/",{"text":392,"config":686},{"href":394,"dataGaName":392,"dataGaLocation":675},{"text":688,"config":689},"GitLab on AWS",{"href":690,"dataGaName":688,"dataGaLocation":675},"/partners/technology-partners/aws/",{"text":692,"config":693},"GitLab on Google Cloud",{"href":694,"dataGaName":692,"dataGaLocation":675},"/partners/technology-partners/google-cloud-platform/",{"text":696,"config":697},"Why GitLab?",{"href":369,"dataGaName":696,"dataGaLocation":675},{"freeTrial":699,"mobileIcon":704,"desktopIcon":709,"secondaryButton":712},{"text":700,"config":701},"Start free trial",{"href":702,"dataGaName":330,"dataGaLocation":703},"https://gitlab.com/-/trials/new/","nav",{"altText":705,"config":706},"Gitlab Icon",{"src":707,"dataGaName":708,"dataGaLocation":703},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":705,"config":710},{"src":711,"dataGaName":708,"dataGaLocation":703},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":713,"config":714},"Get Started",{"href":715,"dataGaName":716,"dataGaLocation":703},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":718,"mobileIcon":722,"desktopIcon":724},{"text":719,"config":720},"Learn more about GitLab Duo",{"href":361,"dataGaName":721,"dataGaLocation":703},"gitlab duo",{"altText":705,"config":723},{"src":707,"dataGaName":708,"dataGaLocation":703},{"altText":705,"config":725},{"src":711,"dataGaName":708,"dataGaLocation":703},{"button":727,"mobileIcon":732,"desktopIcon":734},{"text":728,"config":729},"/switch",{"href":730,"dataGaName":731,"dataGaLocation":703},"#contact","switch",{"altText":705,"config":733},{"src":707,"dataGaName":708,"dataGaLocation":703},{"altText":705,"config":735},{"src":736,"dataGaName":708,"dataGaLocation":703},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":738,"mobileIcon":743,"desktopIcon":745},{"text":739,"config":740},"Back to pricing",{"href":474,"dataGaName":741,"dataGaLocation":703,"icon":742},"back to pricing","GoBack",{"altText":705,"config":744},{"src":707,"dataGaName":708,"dataGaLocation":703},{"altText":705,"config":746},{"src":711,"dataGaName":708,"dataGaLocation":703},{"title":748,"titleMobile":749,"button":750,"config":755},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":367,"config":751},{"href":752,"dataGaName":753,"dataGaLocation":754},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":756,"disabled":303},"release",{"data":758},{"text":759,"source":760,"edit":766,"contribute":771,"config":776,"items":781,"minimal":991},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":761,"config":762},"View page source",{"href":763,"dataGaName":764,"dataGaLocation":765},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":767,"config":768},"Edit this page",{"href":769,"dataGaName":770,"dataGaLocation":765},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":772,"config":773},"Please contribute",{"href":774,"dataGaName":775,"dataGaLocation":765},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":777,"facebook":778,"youtube":779,"linkedin":780},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[782,829,883,927,959],{"title":472,"links":783,"subMenu":798},[784,788,793],{"text":785,"config":786},"View plans",{"href":474,"dataGaName":787,"dataGaLocation":765},"view plans",{"text":789,"config":790},"Why Premium?",{"href":791,"dataGaName":792,"dataGaLocation":765},"/pricing/premium/","why premium",{"text":794,"config":795},"Why Ultimate?",{"href":796,"dataGaName":797,"dataGaLocation":765},"/pricing/ultimate/","why ultimate",[799],{"title":800,"links":801},"Contact Us",[802,805,807,809,814,819,824],{"text":803,"config":804},"Contact sales",{"href":655,"dataGaName":335,"dataGaLocation":765},{"text":658,"config":806},{"href":660,"dataGaName":661,"dataGaLocation":765},{"text":663,"config":808},{"href":665,"dataGaName":666,"dataGaLocation":765},{"text":810,"config":811},"Status",{"href":812,"dataGaName":813,"dataGaLocation":765},"https://status.gitlab.com/","status",{"text":815,"config":816},"Terms of use",{"href":817,"dataGaName":818,"dataGaLocation":765},"/terms/","terms of use",{"text":820,"config":821},"Privacy statement",{"href":822,"dataGaName":823,"dataGaLocation":765},"/privacy/","privacy statement",{"text":825,"config":826},"Cookie preferences",{"dataGaName":827,"dataGaLocation":765,"id":828,"isOneTrustButton":306},"cookie preferences","ot-sdk-btn",{"title":372,"links":830,"subMenu":839},[831,835],{"text":832,"config":833},"DevSecOps platform",{"href":354,"dataGaName":834,"dataGaLocation":765},"devsecops platform",{"text":836,"config":837},"AI-Assisted Development",{"href":361,"dataGaName":838,"dataGaLocation":765},"ai-assisted development",[840],{"title":841,"links":842},"Topics",[843,848,853,858,863,868,873,878],{"text":844,"config":845},"CICD",{"href":846,"dataGaName":847,"dataGaLocation":765},"/topics/ci-cd/","cicd",{"text":849,"config":850},"GitOps",{"href":851,"dataGaName":852,"dataGaLocation":765},"/topics/gitops/","gitops",{"text":854,"config":855},"DevOps",{"href":856,"dataGaName":857,"dataGaLocation":765},"/topics/devops/","devops",{"text":859,"config":860},"Version Control",{"href":861,"dataGaName":862,"dataGaLocation":765},"/topics/version-control/","version control",{"text":864,"config":865},"DevSecOps",{"href":866,"dataGaName":867,"dataGaLocation":765},"/topics/devsecops/","devsecops",{"text":869,"config":870},"Cloud Native",{"href":871,"dataGaName":872,"dataGaLocation":765},"/topics/cloud-native/","cloud native",{"text":874,"config":875},"AI for Coding",{"href":876,"dataGaName":877,"dataGaLocation":765},"/topics/devops/ai-for-coding/","ai for coding",{"text":879,"config":880},"Agentic AI",{"href":881,"dataGaName":882,"dataGaLocation":765},"/topics/agentic-ai/","agentic ai",{"title":884,"links":885},"Solutions",[886,888,890,895,899,902,906,909,911,914,917,922],{"text":416,"config":887},{"href":411,"dataGaName":416,"dataGaLocation":765},{"text":405,"config":889},{"href":388,"dataGaName":389,"dataGaLocation":765},{"text":891,"config":892},"Agile development",{"href":893,"dataGaName":894,"dataGaLocation":765},"/solutions/agile-delivery/","agile delivery",{"text":896,"config":897},"SCM",{"href":401,"dataGaName":898,"dataGaLocation":765},"source code management",{"text":844,"config":900},{"href":394,"dataGaName":901,"dataGaLocation":765},"continuous integration & delivery",{"text":903,"config":904},"Value stream management",{"href":444,"dataGaName":905,"dataGaLocation":765},"value stream management",{"text":849,"config":907},{"href":908,"dataGaName":852,"dataGaLocation":765},"/solutions/gitops/",{"text":454,"config":910},{"href":457,"dataGaName":458,"dataGaLocation":765},{"text":912,"config":913},"Small business",{"href":463,"dataGaName":464,"dataGaLocation":765},{"text":915,"config":916},"Public sector",{"href":469,"dataGaName":470,"dataGaLocation":765},{"text":918,"config":919},"Education",{"href":920,"dataGaName":921,"dataGaLocation":765},"/solutions/education/","education",{"text":923,"config":924},"Financial services",{"href":925,"dataGaName":926,"dataGaLocation":765},"/solutions/finance/","financial services",{"title":477,"links":928},[929,931,933,935,938,940,943,945,947,949,951,953,955,957],{"text":490,"config":930},{"href":492,"dataGaName":493,"dataGaLocation":765},{"text":495,"config":932},{"href":497,"dataGaName":498,"dataGaLocation":765},{"text":500,"config":934},{"href":502,"dataGaName":503,"dataGaLocation":765},{"text":505,"config":936},{"href":507,"dataGaName":937,"dataGaLocation":765},"docs",{"text":527,"config":939},{"href":529,"dataGaName":530,"dataGaLocation":765},{"text":941,"config":942},"What's new",{"href":587,"dataGaName":588,"dataGaLocation":765},{"text":522,"config":944},{"href":524,"dataGaName":525,"dataGaLocation":765},{"text":541,"config":946},{"href":543,"dataGaName":544,"dataGaLocation":765},{"text":549,"config":948},{"href":551,"dataGaName":552,"dataGaLocation":765},{"text":554,"config":950},{"href":556,"dataGaName":557,"dataGaLocation":765},{"text":559,"config":952},{"href":561,"dataGaName":562,"dataGaLocation":765},{"text":564,"config":954},{"href":566,"dataGaName":567,"dataGaLocation":765},{"text":569,"config":956},{"href":571,"dataGaName":572,"dataGaLocation":765},{"text":574,"config":958},{"href":576,"dataGaName":577,"dataGaLocation":765},{"title":590,"links":960},[961,963,965,967,969,971,975,980,982,984,986],{"text":598,"config":962},{"href":600,"dataGaName":592,"dataGaLocation":765},{"text":603,"config":964},{"href":605,"dataGaName":606,"dataGaLocation":765},{"text":611,"config":966},{"href":613,"dataGaName":614,"dataGaLocation":765},{"text":616,"config":968},{"href":618,"dataGaName":619,"dataGaLocation":765},{"text":621,"config":970},{"href":623,"dataGaName":624,"dataGaLocation":765},{"text":972,"config":973},"Sustainability",{"href":974,"dataGaName":972,"dataGaLocation":765},"/sustainability/",{"text":976,"config":977},"Diversity, inclusion and belonging (DIB)",{"href":978,"dataGaName":979,"dataGaLocation":765},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":626,"config":981},{"href":628,"dataGaName":629,"dataGaLocation":765},{"text":636,"config":983},{"href":638,"dataGaName":639,"dataGaLocation":765},{"text":641,"config":985},{"href":643,"dataGaName":644,"dataGaLocation":765},{"text":987,"config":988},"Modern Slavery Transparency Statement",{"href":989,"dataGaName":990,"dataGaLocation":765},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":992},[993,996,999],{"text":994,"config":995},"Terms",{"href":817,"dataGaName":818,"dataGaLocation":765},{"text":997,"config":998},"Cookies",{"dataGaName":827,"dataGaLocation":765,"id":828,"isOneTrustButton":306},{"text":1000,"config":1001},"Privacy",{"href":822,"dataGaName":823,"dataGaLocation":765},[1003],{"id":1004,"title":7,"body":302,"config":1005,"content":1007,"description":302,"extension":1011,"meta":1012,"navigation":306,"path":1013,"seo":1014,"stem":1015,"__hash__":1016},"blogAuthors/en-us/blog/authors/tomas-vik.yml",{"template":1006},"BlogAuthor",{"name":7,"config":1008},{"headshot":1009,"ctfId":1010},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681785/Blog/Author%20Headshots/viktomas-headshot.jpg","viktomas","yml",{},"/en-us/blog/authors/tomas-vik",{},"en-us/blog/authors/tomas-vik","xMgrgX8trHq0ptpdbhdKrT_9Rld39Gvh3CZcZ3x0MqU",[1018,1027,1035],{"title":1019,"description":1020,"heroImage":1021,"category":298,"date":1022,"authors":1023,"slug":1026,"externalUrl":302},"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",[1024,1025],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1028,"description":1029,"heroImage":1030,"category":298,"date":1031,"authors":1032,"slug":1034,"externalUrl":302},"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",[1033],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1036,"description":1037,"heroImage":1038,"category":298,"date":1039,"authors":1040,"slug":1042,"externalUrl":302},"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",[1041],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1044},[1045,1059,1071,1083],{"id":1046,"categories":1047,"header":1049,"text":1050,"button":1051,"image":1056},"ai-modernization",[1048],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1052,"config":1053},"Get your AI maturity score",{"href":1054,"dataGaName":1055,"dataGaLocation":530},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1057},{"src":1058},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1060,"categories":1061,"header":1063,"text":1050,"button":1064,"image":1068},"devops-modernization",[1062,867],"product","Are you just managing tools or shipping innovation?",{"text":1065,"config":1066},"Get your DevOps maturity score",{"href":1067,"dataGaName":1055,"dataGaLocation":530},"/assessments/devops-modernization-assessment/",{"config":1069},{"src":1070},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1072,"categories":1073,"header":1075,"text":1050,"button":1076,"image":1080},"security-modernization",[1074],"security","Are you trading speed for security?",{"text":1077,"config":1078},"Get your security maturity score",{"href":1079,"dataGaName":1055,"dataGaLocation":530},"/assessments/security-modernization-assessment/",{"config":1081},{"src":1082},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1084,"paths":1085,"header":1088,"text":1089,"button":1090,"image":1095},"github-azure-migration",[1086,1087],"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":1091,"config":1092},"See how GitLab compares to GitHub",{"href":1093,"dataGaName":1094,"dataGaLocation":530},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1096},{"src":1070},{"header":1098,"blurb":1099,"button":1100,"secondaryButton":1105},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1101,"config":1102},"Get your free trial",{"href":1103,"dataGaName":330,"dataGaLocation":1104},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":803,"config":1106},{"href":655,"dataGaName":335,"dataGaLocation":1104},1786803751435]