[{"data":1,"prerenderedAt":1102},["ShallowReactive",2],{"/blog/why-we-chose-vue":3,"navigation-en-us":316,"banner-en-us":743,"footer-en-us":753,"blog-post-authors-en-us-Jacob Schatz":998,"blog-related-posts-en-us-why-we-chose-vue":1012,"blog-promotions-en-us":1038,"next-steps-en-us":1092},{"id":4,"title":5,"authors":6,"body":8,"category":299,"date":300,"description":301,"extension":302,"externalUrl":303,"faq":303,"featured":304,"heroImage":305,"meta":306,"navigation":289,"path":307,"seo":308,"slug":312,"stem":313,"tags":303,"template":314,"updatedDate":303,"__hash__":315},"blogPosts/en-us/blog/why-we-chose-vue.md","Why we chose Vue.js",[7],"Jacob Schatz",{"type":9,"value":10,"toc":294},"minimark",[11,15,18,21,31,36,58,61,64,67,76,163,226,229,240,244,251,262,265,278,282,290],[12,13,14],"p",{},"I had a great conversation with an interviewee a few weeks ago about how one\nshould go about choosing a JavaScript framework.",[12,16,17],{},"He pointed out that when a major software company releases their secret sauce,\nthere is going to be hype. Devs think to themselves, \"That company writes JS\ndifferently than me, and they are prominent and successful. Is their way of\nwriting JS better than mine? And therefore must I adopt it?\"",[12,19,20],{},"Their secret sauce may be awesome, but don't assume awesomeness just because everyone else gets excited. You wouldn't copy and paste an answer from StackOverflow, without understanding it, so why copy and paste an entire framework?",[12,22,23,24,30],{},"Which brings me to our decision to use ",[25,26,29],"a",{"href":27,"rel":28},"https://vuejs.org/",[],"Vue.js"," at GitLab.",[32,33,35],"h2",{"id":34},"simplicity-and-ease-of-use","Simplicity and ease of use",[12,37,38,39,43,44,47,48,52,53,57],{},"Primarily what drew us to Vue.js is that it allows our team to ",[40,41,42],"em",{},"easily"," write ",[40,45,46],{},"simple","\nJavaScript. Getting started with Vue.js is extremely easy. Its ",[25,49,51],{"href":50},"/solutions/source-code-management/","source code"," is\nvery readable, and the documentation is the only tutorial you'll ever need. You\ndon't need external libraries. You can use it with or without jQuery. You won't\nneed to install any plugins, though many are available. I like vanilla Vue.js\npersonally, although I can reach for vue-resource when I need it. Hooking Vue.js\nup to existing code is very straightforward. There's no magic to Vue.js -- it's ",[54,55,56],"code",{},"Object","s\nall the way down.",[12,59,60],{},"I talk to a lot of JavaScript devs and I find it really interesting that the ones who\nspend the most time in Angular tend to not know JavaScript nearly as well. I don't want\nthat to be me or our devs. Why should we write \"not JavaScript?\"",[12,62,63],{},"I remember back when I was using Backbone, I had to really force myself to stay\nDRY, because it's really a blank canvas. Vue.js does not make large assumptions\nabout much of anything either. It really only assumes that your data will change.",[12,65,66],{},"But Vue.js comes with the perfect balance of what it will do for you and what you\nneed to do yourself. If Backbone was anarchy (no one in charge) and Angular is a\ndictatorship (the Angular team is in charge), I'd say Vue.js is like socialism: you\nare definitely in charge, but Vue.js is always within reach, a sturdy, but\nflexible safety net ready to help you keep your programming efficient and your\nDOM-inflicted suffering to a minimum.",[12,68,69,70,75],{},"To give you an idea of what I mean, here's a simple\n",[25,71,74],{"href":72,"rel":73},"http://codepen.io/jschatz1/pen/dpQkpx",[],"Codepen",":",[77,78,83],"pre",{"className":79,"code":80,"language":81,"meta":82,"style":82},"language-html shiki shiki-themes github-light","\u003Cdiv id=\"journal\">\n  \u003Cinput type=\"text\" v-model=\"message\">\n  \u003Cdiv>{{message}}\u003C/div>\n\u003C/div>\n","html","",[54,84,85,112,139,153],{"__ignoreMap":82},[86,87,90,94,98,102,105,109],"span",{"class":88,"line":89},"line",1,[86,91,93],{"class":92},"sgsFI","\u003C",[86,95,97],{"class":96},"shJU0","div",[86,99,101],{"class":100},"s7eDp"," id",[86,103,104],{"class":92},"=",[86,106,108],{"class":107},"sYBdl","\"journal\"",[86,110,111],{"class":92},">\n",[86,113,115,118,121,124,126,129,132,134,137],{"class":88,"line":114},2,[86,116,117],{"class":92},"  \u003C",[86,119,120],{"class":96},"input",[86,122,123],{"class":100}," type",[86,125,104],{"class":92},[86,127,128],{"class":107},"\"text\"",[86,130,131],{"class":100}," v-model",[86,133,104],{"class":92},[86,135,136],{"class":107},"\"message\"",[86,138,111],{"class":92},[86,140,142,144,146,149,151],{"class":88,"line":141},3,[86,143,117],{"class":92},[86,145,97],{"class":96},[86,147,148],{"class":92},">{{message}}\u003C/",[86,150,97],{"class":96},[86,152,111],{"class":92},[86,154,156,159,161],{"class":88,"line":155},4,[86,157,158],{"class":92},"\u003C/",[86,160,97],{"class":96},[86,162,111],{"class":92},[77,164,168],{"className":165,"code":166,"language":167,"meta":82,"style":82},"language-javascript shiki shiki-themes github-light","var journal = new Vue({\n  el: '#journal',\n  data: {\n    message: 'Your first entry'\n  }\n});\n","javascript",[54,169,170,190,201,206,214,220],{"__ignoreMap":82},[86,171,172,176,179,181,184,187],{"class":88,"line":89},[86,173,175],{"class":174},"sD7c4","var",[86,177,178],{"class":92}," journal ",[86,180,104],{"class":174},[86,182,183],{"class":174}," new",[86,185,186],{"class":100}," Vue",[86,188,189],{"class":92},"({\n",[86,191,192,195,198],{"class":88,"line":114},[86,193,194],{"class":92},"  el: ",[86,196,197],{"class":107},"'#journal'",[86,199,200],{"class":92},",\n",[86,202,203],{"class":88,"line":141},[86,204,205],{"class":92},"  data: {\n",[86,207,208,211],{"class":88,"line":155},[86,209,210],{"class":92},"    message: ",[86,212,213],{"class":107},"'Your first entry'\n",[86,215,217],{"class":88,"line":216},5,[86,218,219],{"class":92},"  }\n",[86,221,223],{"class":88,"line":222},6,[86,224,225],{"class":92},"});\n",[12,227,228],{},"If you've seen a few JavaScript libraries, it's not hard to understand everything in\nthis example without any documentation. And usually with other frameworks, this is\nwhere the simplicity stops. You get nice, simple examples when you're \"Getting\nstarted\", but in reality things get complicated as soon as you to try to get\nyour money's worth out of the framework. Not with Vue.js though -- real-life usage\nseems to stay as simple as the docs.",[12,230,231,232,235,236,239],{},"And that is what we love about Vue.js: it's an elegant combination of structure\nand simplicity. The data for the view goes in an object called ",[54,233,234],{},"data",", but the\ndata can get there and look however you want. Any functions you'll write as\ncallbacks for events go into a ",[54,237,238],{},"methods"," object, but they can do or return whatever\nyou want. Vue.js just knows when things change and updates your views. And you write less code.",[32,241,243],{"id":242},"vuejs-gitlab-less-code","Vue.js + GitLab === Less code",[12,245,246,247,250],{},"So what problem does this solve for GitLab? When I joined, all the JavaScript was written\nwith JQuery. There is nothing ",[40,248,249],{},"wrong"," with that, except that it takes a lot\nmore code to solve every problem. We knew we could do better. Once we started with\nVue.js, we could immediately and consistently solve complex problems in much less time.",[12,252,253,254,257,258,261],{},"A simple, but practical example we're using in production: on a GitLab\nIssue, the issue's state is displayed as either ",[54,255,256],{},"closed"," or ",[54,259,260],{},"open",". That\nsimple value can change often and needs to be represented in several views.\nWith JQuery, we had about 30 or so lines of code to propagate those changes, and\nthose lines involved multiple classes and querying the DOM by hand.",[12,263,264],{},"In Vue.js, this now requires us to write one line of JavaScript. The only other code\nwe add is in the HTML, and that's just a few additional attributes.",[12,266,267,268,273,274,277],{},"What ",[25,269,272],{"href":270,"rel":271},"https://twitter.com/youyuxi",[],"Evan You"," knows is that creating a kick ass framework isn't just about\nwriting great code. You need excellent documentation, a strong community helping each other\nlearn, a supporting cast of libraries and plugins to help users solve the hard problems,\nand short feedback loops based on user feedback to keep the framework relevant. Vue.js is all\nof that, ",[40,275,276],{},"plus"," great code. That's why we're using it. What about you?",[32,279,281],{"id":280},"watch-the-why-we-chose-vuejs-webcast","Watch the Why We Chose Vue.js webcast",[283,284],"iframe",{"width":285,"height":286,"src":287,"frameBorder":288,"allowFullScreen":289},560,315,"https://www.youtube.com/embed/ioogrvs2Ejc","0",true,[291,292,293],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":82,"searchDepth":114,"depth":114,"links":295},[296,297,298],{"id":34,"depth":114,"text":35},{"id":242,"depth":114,"text":243},{"id":280,"depth":114,"text":281},"engineering","2016-10-20","Why GitLab went with Vue.js","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666262/Blog/Hero%20Images/default-blog-image.png",{},"/en-us/blog/why-we-chose-vue",{"title":5,"description":301,"ogTitle":5,"ogDescription":301,"noIndex":304,"ogImage":305,"ogUrl":309,"ogSiteName":310,"ogType":311,"canonicalUrls":309},"https://about.gitlab.com/blog/why-we-chose-vue","https://about.gitlab.com","article","why-we-chose-vue","en-us/blog/why-we-chose-vue","BlogPost","3MYUltwosUYNo3TslrepPqtkuksInFa-japQpFgOmKQ",{"logo":317,"freeTrial":322,"sales":327,"login":332,"items":337,"search":663,"minimal":694,"duo":713,"switchNav":722,"pricingDeployment":733},{"config":318},{"href":319,"dataGaName":320,"dataGaLocation":321},"/","gitlab logo","header",{"text":323,"config":324},"Get free trial",{"href":325,"dataGaName":326,"dataGaLocation":321},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":328,"config":329},"Request a demo",{"href":330,"dataGaName":331,"dataGaLocation":321},"/sales/?contact-topic=request-demo","sales",{"text":333,"config":334},"Sign in",{"href":335,"dataGaName":336,"dataGaLocation":321},"https://gitlab.com/users/sign_in/","sign in",[338,367,466,471,585,641],{"text":339,"config":340,"menu":342},"Platform",{"dataNavLevelOne":341},"platform",{"type":343,"columns":344},"cards",[345,351,359],{"title":339,"description":346,"link":347},"The intelligent orchestration platform for DevSecOps",{"text":348,"config":349},"Explore our Platform",{"href":350,"dataGaName":341,"dataGaLocation":321},"/platform/",{"title":352,"description":353,"link":354},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":355,"config":356},"Meet GitLab Duo",{"href":357,"dataGaName":358,"dataGaLocation":321},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":360,"description":361,"link":362},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":363,"config":364},"Learn more",{"href":365,"dataGaName":366,"dataGaLocation":321},"/why-gitlab/","why gitlab",{"text":368,"left":289,"config":369,"menu":371},"Product",{"dataNavLevelOne":370},"solutions",{"type":372,"link":373,"columns":377,"feature":445},"lists",{"text":374,"config":375},"View all Solutions",{"href":376,"dataGaName":370,"dataGaLocation":321},"/solutions/",[378,401,424],{"title":379,"description":380,"link":381,"items":386},"Automation","CI/CD and automation to accelerate deployment",{"config":382},{"icon":383,"href":384,"dataGaName":385,"dataGaLocation":321},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[387,391,394,397],{"text":388,"config":389},"CI/CD",{"href":390,"dataGaLocation":321,"dataGaName":388},"/solutions/continuous-integration/",{"text":352,"config":392},{"href":357,"dataGaLocation":321,"dataGaName":393},"gitlab duo agent platform - product menu",{"text":395,"config":396},"Source Code Management",{"href":50,"dataGaLocation":321,"dataGaName":395},{"text":398,"config":399},"Automated Software Delivery",{"href":384,"dataGaLocation":321,"dataGaName":400},"Automated software delivery",{"title":402,"description":403,"link":404,"items":409},"Security","Deliver code faster without compromising security",{"config":405},{"href":406,"dataGaName":407,"dataGaLocation":321,"icon":408},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[410,414,419],{"text":411,"config":412},"Application Security Testing",{"href":406,"dataGaName":413,"dataGaLocation":321},"Application security testing",{"text":415,"config":416},"Software Supply Chain Security",{"href":417,"dataGaLocation":321,"dataGaName":418},"/solutions/supply-chain/","Software supply chain security",{"text":420,"config":421},"Software Compliance",{"href":422,"dataGaName":423,"dataGaLocation":321},"/solutions/software-compliance/","software compliance",{"title":425,"link":426,"items":431},"Measurement",{"config":427},{"icon":428,"href":429,"dataGaName":430,"dataGaLocation":321},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[432,436,440],{"text":433,"config":434},"Visibility & Measurement",{"href":429,"dataGaLocation":321,"dataGaName":435},"Visibility and Measurement",{"text":437,"config":438},"Value Stream Management",{"href":439,"dataGaLocation":321,"dataGaName":437},"/solutions/value-stream-management/",{"text":441,"config":442},"Analytics & Insights",{"href":443,"dataGaLocation":321,"dataGaName":444},"/solutions/analytics-and-insights/","Analytics and insights",{"title":446,"type":372,"items":447},"GitLab for",[448,454,460],{"text":449,"config":450},"Enterprise",{"icon":451,"href":452,"dataGaLocation":321,"dataGaName":453},"Building","/enterprise/","enterprise",{"text":455,"config":456},"Small Business",{"icon":457,"href":458,"dataGaLocation":321,"dataGaName":459},"Work","/small-business/","small business",{"text":461,"config":462},"Public Sector",{"icon":463,"href":464,"dataGaLocation":321,"dataGaName":465},"Organization","/solutions/public-sector/","public sector",{"text":467,"config":468},"Pricing",{"href":469,"dataGaName":470,"dataGaLocation":321,"dataNavLevelOne":470},"/pricing/","pricing",{"text":472,"config":473,"menu":475},"Resources",{"dataNavLevelOne":474},"resources",{"type":372,"link":476,"columns":480,"feature":574},{"text":477,"config":478},"View all resources",{"href":479,"dataGaName":474,"dataGaLocation":321},"/resources/",[481,514,541],{"title":482,"items":483},"Getting started",[484,489,494,499,504,509],{"text":485,"config":486},"Install",{"href":487,"dataGaName":488,"dataGaLocation":321},"/install/","install",{"text":490,"config":491},"Quick start guides",{"href":492,"dataGaName":493,"dataGaLocation":321},"/get-started/","quick setup checklists",{"text":495,"config":496},"Learn",{"href":497,"dataGaLocation":321,"dataGaName":498},"https://university.gitlab.com/","learn",{"text":500,"config":501},"Product documentation",{"href":502,"dataGaName":503,"dataGaLocation":321},"https://docs.gitlab.com/","product documentation",{"text":505,"config":506},"Best practice videos",{"href":507,"dataGaName":508,"dataGaLocation":321},"/getting-started-videos/","best practice videos",{"text":510,"config":511},"Integrations",{"href":512,"dataGaName":513,"dataGaLocation":321},"/integrations/","integrations",{"title":515,"items":516},"Discover",[517,522,527,532,536],{"text":518,"config":519},"Customer success stories",{"href":520,"dataGaName":521,"dataGaLocation":321},"/customers/","customer success stories",{"text":523,"config":524},"Blog",{"href":525,"dataGaName":526,"dataGaLocation":321},"/blog/","blog",{"text":528,"config":529},"Demo Hub",{"href":530,"dataGaName":531,"dataGaLocation":321},"/demo-hub/","demo hub",{"text":533,"config":534},"The Source",{"href":535,"dataGaName":526,"dataGaLocation":321},"/the-source/",{"text":537,"config":538},"Remote",{"href":539,"dataGaName":540,"dataGaLocation":321},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":542,"items":543},"Connect",[544,549,554,559,564,569],{"text":545,"config":546},"GitLab Services",{"href":547,"dataGaName":548,"dataGaLocation":321},"/services/","services",{"text":550,"config":551},"Contribute",{"href":552,"dataGaName":553,"dataGaLocation":321},"https://contributors.gitlab.com","contribute",{"text":555,"config":556},"Community",{"href":557,"dataGaName":558,"dataGaLocation":321},"/community/","community",{"text":560,"config":561},"Forum",{"href":562,"dataGaName":563,"dataGaLocation":321},"https://forum.gitlab.com/","forum",{"text":565,"config":566},"Events",{"href":567,"dataGaName":568,"dataGaLocation":321},"/events/","events",{"text":570,"config":571},"Partners",{"href":572,"dataGaName":573,"dataGaLocation":321},"/partners/","partners",{"config":575,"title":578,"text":579,"link":580},{"background":576,"textColor":577},"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":581,"config":582},"Read the latest",{"href":583,"dataGaName":584,"dataGaLocation":321},"/whats-new/","whats new",{"text":586,"config":587,"menu":589},"Company",{"dataNavLevelOne":588},"company",{"type":372,"columns":590},[591],{"items":592},[593,598,604,606,611,616,621,626,631,636],{"text":594,"config":595},"About",{"href":596,"dataGaName":597,"dataGaLocation":321},"/company/","about",{"text":599,"config":600,"footerGa":603},"Jobs",{"href":601,"dataGaName":602,"dataGaLocation":321},"/jobs/","jobs",{"dataGaName":602},{"text":565,"config":605},{"href":567,"dataGaName":568,"dataGaLocation":321},{"text":607,"config":608},"Leadership",{"href":609,"dataGaName":610,"dataGaLocation":321},"/company/team/e-group/","leadership",{"text":612,"config":613},"Handbook",{"href":614,"dataGaName":615,"dataGaLocation":321},"https://handbook.gitlab.com/","handbook",{"text":617,"config":618},"Investor relations",{"href":619,"dataGaName":620,"dataGaLocation":321},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":622,"config":623},"Trust Center",{"href":624,"dataGaName":625,"dataGaLocation":321},"/security/","trust center",{"text":627,"config":628},"AI Transparency Center",{"href":629,"dataGaName":630,"dataGaLocation":321},"/ai-transparency-center/","ai transparency center",{"text":632,"config":633},"Newsletter",{"href":634,"dataGaName":635,"dataGaLocation":321},"/company/contact/#contact-forms","newsletter",{"text":637,"config":638},"Press",{"href":639,"dataGaName":640,"dataGaLocation":321},"/press/","press",{"text":642,"config":643,"menu":644},"Contact us",{"dataNavLevelOne":588},{"type":372,"columns":645},[646],{"items":647},[648,653,658],{"text":649,"config":650},"Talk to sales",{"href":651,"dataGaName":652,"dataGaLocation":321},"/sales/","talk to sales",{"text":654,"config":655},"Support portal",{"href":656,"dataGaName":657,"dataGaLocation":321},"https://support.gitlab.com/hc/en-us","support portal",{"text":659,"config":660},"Customer portal",{"href":661,"dataGaName":662,"dataGaLocation":321},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":664,"login":665,"suggestions":672},"Close",{"text":666,"link":667},"To search repositories and projects, login to",{"text":668,"config":669},"gitlab.com",{"href":335,"dataGaName":670,"dataGaLocation":671},"search login","search",{"text":673,"default":674},"Suggestions",[675,677,681,683,687,691],{"text":352,"config":676},{"href":357,"dataGaName":352,"dataGaLocation":671},{"text":678,"config":679},"Code Suggestions (AI)",{"href":680,"dataGaName":678,"dataGaLocation":671},"/solutions/code-suggestions/",{"text":388,"config":682},{"href":390,"dataGaName":388,"dataGaLocation":671},{"text":684,"config":685},"GitLab on AWS",{"href":686,"dataGaName":684,"dataGaLocation":671},"/partners/technology-partners/aws/",{"text":688,"config":689},"GitLab on Google Cloud",{"href":690,"dataGaName":688,"dataGaLocation":671},"/partners/technology-partners/google-cloud-platform/",{"text":692,"config":693},"Why GitLab?",{"href":365,"dataGaName":692,"dataGaLocation":671},{"freeTrial":695,"mobileIcon":700,"desktopIcon":705,"secondaryButton":708},{"text":696,"config":697},"Start free trial",{"href":698,"dataGaName":326,"dataGaLocation":699},"https://gitlab.com/-/trials/new/","nav",{"altText":701,"config":702},"Gitlab Icon",{"src":703,"dataGaName":704,"dataGaLocation":699},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":701,"config":706},{"src":707,"dataGaName":704,"dataGaLocation":699},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":709,"config":710},"Get Started",{"href":711,"dataGaName":712,"dataGaLocation":699},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":714,"mobileIcon":718,"desktopIcon":720},{"text":715,"config":716},"Learn more about GitLab Duo",{"href":357,"dataGaName":717,"dataGaLocation":699},"gitlab duo",{"altText":701,"config":719},{"src":703,"dataGaName":704,"dataGaLocation":699},{"altText":701,"config":721},{"src":707,"dataGaName":704,"dataGaLocation":699},{"button":723,"mobileIcon":728,"desktopIcon":730},{"text":724,"config":725},"/switch",{"href":726,"dataGaName":727,"dataGaLocation":699},"#contact","switch",{"altText":701,"config":729},{"src":703,"dataGaName":704,"dataGaLocation":699},{"altText":701,"config":731},{"src":732,"dataGaName":704,"dataGaLocation":699},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":734,"mobileIcon":739,"desktopIcon":741},{"text":735,"config":736},"Back to pricing",{"href":469,"dataGaName":737,"dataGaLocation":699,"icon":738},"back to pricing","GoBack",{"altText":701,"config":740},{"src":703,"dataGaName":704,"dataGaLocation":699},{"altText":701,"config":742},{"src":707,"dataGaName":704,"dataGaLocation":699},{"title":744,"titleMobile":745,"button":746,"config":751},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":363,"config":747},{"href":748,"dataGaName":749,"dataGaLocation":750},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":752,"disabled":304},"release",{"data":754},{"text":755,"source":756,"edit":762,"contribute":767,"config":772,"items":777,"minimal":987},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":757,"config":758},"View page source",{"href":759,"dataGaName":760,"dataGaLocation":761},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":763,"config":764},"Edit this page",{"href":765,"dataGaName":766,"dataGaLocation":761},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":768,"config":769},"Please contribute",{"href":770,"dataGaName":771,"dataGaLocation":761},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":773,"facebook":774,"youtube":775,"linkedin":776},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[778,825,879,923,955],{"title":467,"links":779,"subMenu":794},[780,784,789],{"text":781,"config":782},"View plans",{"href":469,"dataGaName":783,"dataGaLocation":761},"view plans",{"text":785,"config":786},"Why Premium?",{"href":787,"dataGaName":788,"dataGaLocation":761},"/pricing/premium/","why premium",{"text":790,"config":791},"Why Ultimate?",{"href":792,"dataGaName":793,"dataGaLocation":761},"/pricing/ultimate/","why ultimate",[795],{"title":796,"links":797},"Contact Us",[798,801,803,805,810,815,820],{"text":799,"config":800},"Contact sales",{"href":651,"dataGaName":331,"dataGaLocation":761},{"text":654,"config":802},{"href":656,"dataGaName":657,"dataGaLocation":761},{"text":659,"config":804},{"href":661,"dataGaName":662,"dataGaLocation":761},{"text":806,"config":807},"Status",{"href":808,"dataGaName":809,"dataGaLocation":761},"https://status.gitlab.com/","status",{"text":811,"config":812},"Terms of use",{"href":813,"dataGaName":814,"dataGaLocation":761},"/terms/","terms of use",{"text":816,"config":817},"Privacy statement",{"href":818,"dataGaName":819,"dataGaLocation":761},"/privacy/","privacy statement",{"text":821,"config":822},"Cookie preferences",{"dataGaName":823,"dataGaLocation":761,"id":824,"isOneTrustButton":289},"cookie preferences","ot-sdk-btn",{"title":368,"links":826,"subMenu":835},[827,831],{"text":828,"config":829},"DevSecOps platform",{"href":350,"dataGaName":830,"dataGaLocation":761},"devsecops platform",{"text":832,"config":833},"AI-Assisted Development",{"href":357,"dataGaName":834,"dataGaLocation":761},"ai-assisted development",[836],{"title":837,"links":838},"Topics",[839,844,849,854,859,864,869,874],{"text":840,"config":841},"CICD",{"href":842,"dataGaName":843,"dataGaLocation":761},"/topics/ci-cd/","cicd",{"text":845,"config":846},"GitOps",{"href":847,"dataGaName":848,"dataGaLocation":761},"/topics/gitops/","gitops",{"text":850,"config":851},"DevOps",{"href":852,"dataGaName":853,"dataGaLocation":761},"/topics/devops/","devops",{"text":855,"config":856},"Version Control",{"href":857,"dataGaName":858,"dataGaLocation":761},"/topics/version-control/","version control",{"text":860,"config":861},"DevSecOps",{"href":862,"dataGaName":863,"dataGaLocation":761},"/topics/devsecops/","devsecops",{"text":865,"config":866},"Cloud Native",{"href":867,"dataGaName":868,"dataGaLocation":761},"/topics/cloud-native/","cloud native",{"text":870,"config":871},"AI for Coding",{"href":872,"dataGaName":873,"dataGaLocation":761},"/topics/devops/ai-for-coding/","ai for coding",{"text":875,"config":876},"Agentic AI",{"href":877,"dataGaName":878,"dataGaLocation":761},"/topics/agentic-ai/","agentic ai",{"title":880,"links":881},"Solutions",[882,884,886,891,895,898,902,905,907,910,913,918],{"text":411,"config":883},{"href":406,"dataGaName":411,"dataGaLocation":761},{"text":400,"config":885},{"href":384,"dataGaName":385,"dataGaLocation":761},{"text":887,"config":888},"Agile development",{"href":889,"dataGaName":890,"dataGaLocation":761},"/solutions/agile-delivery/","agile delivery",{"text":892,"config":893},"SCM",{"href":50,"dataGaName":894,"dataGaLocation":761},"source code management",{"text":840,"config":896},{"href":390,"dataGaName":897,"dataGaLocation":761},"continuous integration & delivery",{"text":899,"config":900},"Value stream management",{"href":439,"dataGaName":901,"dataGaLocation":761},"value stream management",{"text":845,"config":903},{"href":904,"dataGaName":848,"dataGaLocation":761},"/solutions/gitops/",{"text":449,"config":906},{"href":452,"dataGaName":453,"dataGaLocation":761},{"text":908,"config":909},"Small business",{"href":458,"dataGaName":459,"dataGaLocation":761},{"text":911,"config":912},"Public sector",{"href":464,"dataGaName":465,"dataGaLocation":761},{"text":914,"config":915},"Education",{"href":916,"dataGaName":917,"dataGaLocation":761},"/solutions/education/","education",{"text":919,"config":920},"Financial services",{"href":921,"dataGaName":922,"dataGaLocation":761},"/solutions/finance/","financial services",{"title":472,"links":924},[925,927,929,931,934,936,939,941,943,945,947,949,951,953],{"text":485,"config":926},{"href":487,"dataGaName":488,"dataGaLocation":761},{"text":490,"config":928},{"href":492,"dataGaName":493,"dataGaLocation":761},{"text":495,"config":930},{"href":497,"dataGaName":498,"dataGaLocation":761},{"text":500,"config":932},{"href":502,"dataGaName":933,"dataGaLocation":761},"docs",{"text":523,"config":935},{"href":525,"dataGaName":526,"dataGaLocation":761},{"text":937,"config":938},"What's new",{"href":583,"dataGaName":584,"dataGaLocation":761},{"text":518,"config":940},{"href":520,"dataGaName":521,"dataGaLocation":761},{"text":537,"config":942},{"href":539,"dataGaName":540,"dataGaLocation":761},{"text":545,"config":944},{"href":547,"dataGaName":548,"dataGaLocation":761},{"text":550,"config":946},{"href":552,"dataGaName":553,"dataGaLocation":761},{"text":555,"config":948},{"href":557,"dataGaName":558,"dataGaLocation":761},{"text":560,"config":950},{"href":562,"dataGaName":563,"dataGaLocation":761},{"text":565,"config":952},{"href":567,"dataGaName":568,"dataGaLocation":761},{"text":570,"config":954},{"href":572,"dataGaName":573,"dataGaLocation":761},{"title":586,"links":956},[957,959,961,963,965,967,971,976,978,980,982],{"text":594,"config":958},{"href":596,"dataGaName":588,"dataGaLocation":761},{"text":599,"config":960},{"href":601,"dataGaName":602,"dataGaLocation":761},{"text":607,"config":962},{"href":609,"dataGaName":610,"dataGaLocation":761},{"text":612,"config":964},{"href":614,"dataGaName":615,"dataGaLocation":761},{"text":617,"config":966},{"href":619,"dataGaName":620,"dataGaLocation":761},{"text":968,"config":969},"Sustainability",{"href":970,"dataGaName":968,"dataGaLocation":761},"/sustainability/",{"text":972,"config":973},"Diversity, inclusion and belonging (DIB)",{"href":974,"dataGaName":975,"dataGaLocation":761},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":622,"config":977},{"href":624,"dataGaName":625,"dataGaLocation":761},{"text":632,"config":979},{"href":634,"dataGaName":635,"dataGaLocation":761},{"text":637,"config":981},{"href":639,"dataGaName":640,"dataGaLocation":761},{"text":983,"config":984},"Modern Slavery Transparency Statement",{"href":985,"dataGaName":986,"dataGaLocation":761},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":988},[989,992,995],{"text":990,"config":991},"Terms",{"href":813,"dataGaName":814,"dataGaLocation":761},{"text":993,"config":994},"Cookies",{"dataGaName":823,"dataGaLocation":761,"id":824,"isOneTrustButton":289},{"text":996,"config":997},"Privacy",{"href":818,"dataGaName":819,"dataGaLocation":761},[999],{"id":1000,"title":7,"body":303,"config":1001,"content":1003,"description":303,"extension":1006,"meta":1007,"navigation":289,"path":1008,"seo":1009,"stem":1010,"__hash__":1011},"blogAuthors/en-us/blog/authors/jacob-schatz.yml",{"template":1002},"BlogAuthor",{"name":7,"config":1004},{"headshot":82,"ctfId":1005},"jschatz1","yml",{},"/en-us/blog/authors/jacob-schatz",{},"en-us/blog/authors/jacob-schatz","5Ni1pJap-3Oy_IR41XlYvyewBFNZN8dZyOWznuyUvoM",[1013,1022,1030],{"title":1014,"description":1015,"heroImage":1016,"category":299,"date":1017,"authors":1018,"slug":1021,"externalUrl":303},"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",[1019,1020],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1023,"description":1024,"heroImage":1025,"category":299,"date":1026,"authors":1027,"slug":1029,"externalUrl":303},"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",[1028],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1031,"description":1032,"heroImage":1033,"category":299,"date":1034,"authors":1035,"slug":1037,"externalUrl":303},"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",[1036],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1039},[1040,1054,1066,1078],{"id":1041,"categories":1042,"header":1044,"text":1045,"button":1046,"image":1051},"ai-modernization",[1043],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1047,"config":1048},"Get your AI maturity score",{"href":1049,"dataGaName":1050,"dataGaLocation":526},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1052},{"src":1053},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1055,"categories":1056,"header":1058,"text":1045,"button":1059,"image":1063},"devops-modernization",[1057,863],"product","Are you just managing tools or shipping innovation?",{"text":1060,"config":1061},"Get your DevOps maturity score",{"href":1062,"dataGaName":1050,"dataGaLocation":526},"/assessments/devops-modernization-assessment/",{"config":1064},{"src":1065},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1067,"categories":1068,"header":1070,"text":1045,"button":1071,"image":1075},"security-modernization",[1069],"security","Are you trading speed for security?",{"text":1072,"config":1073},"Get your security maturity score",{"href":1074,"dataGaName":1050,"dataGaLocation":526},"/assessments/security-modernization-assessment/",{"config":1076},{"src":1077},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1079,"paths":1080,"header":1083,"text":1084,"button":1085,"image":1090},"github-azure-migration",[1081,1082],"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":1086,"config":1087},"See how GitLab compares to GitHub",{"href":1088,"dataGaName":1089,"dataGaLocation":526},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1091},{"src":1065},{"header":1093,"blurb":1094,"button":1095,"secondaryButton":1100},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1096,"config":1097},"Get your free trial",{"href":1098,"dataGaName":326,"dataGaLocation":1099},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":799,"config":1101},{"href":651,"dataGaName":331,"dataGaLocation":1099},1786803756754]