[{"data":1,"prerenderedAt":1160},["ShallowReactive",2],{"/blog/modernizing-a-simple-c-application-to-java-with-gitlab-duo":3,"navigation-en-us":377,"banner-en-us":803,"footer-en-us":813,"blog-post-authors-en-us-Cesar Saavedra":1057,"blog-related-posts-en-us-modernizing-a-simple-c-application-to-java-with-gitlab-duo":1072,"blog-promotions-en-us":1097,"next-steps-en-us":1150},{"id":4,"title":5,"authors":6,"body":8,"category":354,"date":355,"description":356,"extension":357,"externalUrl":358,"faq":358,"featured":359,"heroImage":360,"meta":361,"navigation":362,"path":363,"seo":364,"slug":368,"stem":369,"tags":370,"template":375,"updatedDate":358,"__hash__":376},"blogPosts/en-us/blog/modernizing-a-simple-c-application-to-java-with-gitlab-duo.md","Modernizing a simple C++ application to Java with GitLab Duo",[7],"Cesar Saavedra",{"type":9,"value":10,"toc":343},"minimark",[11,15,25,30,39,45,58,65,72,78,81,85,88,94,101,106,109,114,120,123,127,134,140,146,155,158,162,165,168,174,177,181,184,187,192,198,201,205,212,215,240,246,249,257,263,266,272,275,279,282,285,298,310,314,339],[12,13,14],"p",{},"Memory unsafe languages are those that do not handle any memory management on behalf of the developer. For example, when programming in C or C++, if you need memory during runtime, you will need to allocate and deallocate the memory yourself, running the risk of ending up with memory leaks in cases when you inadvertently forget to deallocate it. Other languages like Ada and FORTRAN provide some memory management but may not prevent memory leaks. Many organizations, including those in the public sector, have applications that have been developed using languages that are memory unsafe and are often looking to modernize these to a memory safe language, such as Java, Python, JavaScript, or Golang.",[12,16,17,18,24],{},"This tutorial focuses on a specific example of modernizing a simple C++ application to Java by refactoring it with the help of ",[19,20,23],"a",{"href":21,"rel":22},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo",", our suite of AI capabilities, and shows how much time and effort you can save in the migration.",[26,27,29],"h2",{"id":28},"understanding-the-simple-c-application","Understanding the simple C++ application",[12,31,32,33,38],{},"Let’s make the assumption that we have been tasked with the migration of a C++ application to a memory safe language, namely Java. The C++ application can be found in the following project (thank you to ",[19,34,37],{"href":35,"rel":36},"https://gitlab.com/sugaroverflow",[],"@sugaroverflow"," for contributing this sample application):",[12,40,41],{},[19,42,43],{"href":43,"rel":44},"https://gitlab.com/gitlab-da/use-cases/ai/ai-applications/refactor-to-java/air-quality-application",[],[12,46,47,48,52,53,57],{},"Since this is the first time we are seeing this application, let’s invoke GitLab Duo Code explanation to better understand what it does. We open file ",[49,50,51],"code",{},"main.cpp"," in Visual Studio Code and select the entirety of this file. We then right-click and select ",[54,55,56],"strong",{},"GitLab Duo Chat > Explain selected snippet"," from the popup menu.",[12,59,60],{},[61,62],"img",{"alt":63,"src":64},"duo-code-explanation-menu-option","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675546/Blog/Content%20Images/code-explanation-menu-option.png",[12,66,67,68,71],{},"The GitLab Duo Chat window opens up and the slash command ",[49,69,70],{},"/explain"," is executed for the selected code. Chat returns a very thorough and detailed description and explanation in natural language form of what each function does in the file as well as examples on how to run the compiled program.",[12,73,74],{},[61,75],{"alt":76,"src":77},"code-explanation-text","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/code-explanation-text.png",[12,79,80],{},"In short, the simple C++ application takes a U.S. zip code as input and returns the air quality index for that zip code.",[26,82,84],{"id":83},"compiling-and-running-the-c-application","Compiling and running the C++ application",[12,86,87],{},"To further understand this simple C++ application, we proceed to compile and run it. We could have asked Chat how to do this, however, the project has a README file that provides the commands to compile the project, so we go ahead and use those by entering them in the Terminal window of VS Code.",[12,89,90],{},[61,91],{"alt":92,"src":93},"compile-command","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/compile-command.png",[12,95,96,97,100],{},"After the compilation finishes, we change directory to the ",[49,98,99],{},"build"," subdirectory in the project, which is where the compilation process places the executable file for this application. Then, we run the executable by entering the following command:",[12,102,103],{},[49,104,105],{},"./air_quality_app 32836",[12,107,108],{},"And we see the response as follows:",[12,110,111],{},[49,112,113],{},"Air Quality Index (AQI) for Zip Code 32836: 2 (Fair)",[12,115,116],{},[61,117],{"alt":118,"src":119},"cplus-plus-app-execution-output","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/cplus-plus-app-execution-output.png",[12,121,122],{},"This confirms to us that the application was successfully compiled and it’s executing appropriately.",[26,124,126],{"id":125},"refactoring-the-application-to-java","Refactoring the application to Java",[12,128,129,130,133],{},"Let’s start migrating this C++ application to Java. We take advantage of GitLab Duo Chat and its refactoring capabilities by using the slack command ",[49,131,132],{},"/refactor",". We qualify the slash command with specific instructions on what to do for the refactoring. We enter the following command in the Chat input field:",[135,136,137],"blockquote",{},[12,138,139],{},"/refactor this entire application to Java. Provide its associated pom.xml to build and run the Java application. Also, provide the directory structure showing where all the resulting files should reside for the Java application.",[12,141,142],{},[61,143],{"alt":144,"src":145},"refactor-chat-output","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/refactor-chat-output.png",[12,147,148,149,154],{},"Chat returns a set of Java files that basically refactor the entire C++ application to the memory safe language. In addition and per the prompt, Chat returns the pom.xml file, needed by ",[19,150,153],{"href":151,"rel":152},"https://docs.gitlab.com/api/packages/maven/",[],"maven"," for the building and execution of the refactored application as well as its directory structure, indicating where each generated file should reside.",[12,156,157],{},"We copy and save all the generated files to our local directory.",[26,159,161],{"id":160},"creating-the-java-project","Creating the Java project",[12,163,164],{},"In VS Code, we now proceed to open an empty project in which we will set up the directory structure of the new Java application and its contents.",[12,166,167],{},"We create all the previously generated Java files in their corresponding directories in the new project and paste their contents in each.",[12,169,170],{},[61,171],{"alt":172,"src":173},"java-files-created","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/java-files-created.png",[12,175,176],{},"Lastly, we save all the files to our local disk.",[26,178,180],{"id":179},"asking-for-help-to-build-and-run-the-java-application","Asking for help to build and run the Java application",[12,182,183],{},"At this point, we have an entire Java application that has been refactored from C++. Now, we need to build it but we don’t quite remember what maven command we need to use to accomplish this.",[12,185,186],{},"So we ask GitLab Duo Chat about this. We enter the following prompt in the Chat input field:",[135,188,189],{},[12,190,191],{},"How do you build and run this application using maven?",[12,193,194],{},[61,195],{"alt":196,"src":197},"maven-info-output","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/maven-info-output.png",[12,199,200],{},"Chat returns with a thorough explanation on how to do this, including examples of the maven command to build and run the newly created Java application.",[26,202,204],{"id":203},"building-and-running-the-java-application","Building and running the Java application",[12,206,207,208,211],{},"GitLab Duo Chat understands the application and environment context and responds that we first need to create an environment variable called ",[49,209,210],{},"API_KEY"," before we can run the application.",[12,213,214],{},"It also provides the maven command to execute to build the application, which we enter in the Terminal window:",[216,217,222],"pre",{"className":218,"code":219,"language":220,"meta":221,"style":221},"language-shell shiki shiki-themes github-light","mvn clean package\n","shell","",[49,223,224],{"__ignoreMap":221},[225,226,229,233,237],"span",{"class":227,"line":228},"line",1,[225,230,232],{"class":231},"s7eDp","mvn",[225,234,236],{"class":235},"sYBdl"," clean",[225,238,239],{"class":235}," package\n",[12,241,242],{},[61,243],{"alt":244,"src":245},"java-build-output","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/java-build-output.png",[12,247,248],{},"Once the build finishes successfully, we copy the generated command to run the application from the Chat window and paste it in the Terminal window:",[216,250,255],{"className":251,"code":253,"language":254,"meta":221},[252],"language-text","java -jar target/air-quality-checker-1.0-SNAPSHOT-jar-with-dependencies.jar 90210\n","text",[49,256,253],{"__ignoreMap":221},[12,258,259],{},[61,260],{"alt":261,"src":262},"java-app-execution-output","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675547/Blog/Content%20Images/java-app-execution-output.png",[12,264,265],{},"The application successfully executes and returns the string:",[216,267,270],{"className":268,"code":269,"language":254,"meta":221},[252],"Air Quality Index (AQI) for Zip Code 90210: 2 (Fair)\n",[49,271,269],{"__ignoreMap":221},[12,273,274],{},"We have confirmed that the modernized version of the application, now refactored in Java, runs just like its original C++ version.",[26,276,278],{"id":277},"watch-this-tutorial-in-action","Watch this tutorial in action",[12,280,281],{},"We have seen that by leveraging the power of GitLab Duo in your modernization activities, you can save a great deal of time and effort, freeing you to spend more time innovating and creating value to your organization.",[12,283,284],{},"Here is a video to show you, in action, the tutorial you just read:",[286,287,290,291],"figure",{"className":288},[289],"video_container","\n  ",[292,293,297],"iframe",{"src":294,"frameBorder":295,"allowFullScreen":296},"https://www.youtube.com/embed/LJ7GOr_P0xs?si=_ZjF75DAXEQnY2Mn","0","true"," ",[135,299,300],{},[301,302,304,305],"h4",{"id":303},"want-to-get-started-with-gitlab-duo-start-a-free-trial-today","Want to get started with GitLab Duo? ",[19,306,309],{"href":307,"rel":308},"https://about.gitlab.com/sales/",[],"Start a free trial today!",[26,311,313],{"id":312},"learn-more","Learn more",[315,316,317,325,332],"ul",{},[318,319,320],"li",{},[19,321,324],{"href":322,"rel":323},"https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo/",[],"Refactor code into modern languages with AI-powered GitLab Duo",[318,326,327],{},[19,328,331],{"href":329,"rel":330},"https://about.gitlab.com/blog/secure-by-design-principles-meet-devsecops-innovation-in-gitlab-17/",[],"Secure by Design principles meet DevSecOps innovation in GitLab 17",[318,333,334],{},[19,335,338],{"href":336,"rel":337},"https://about.gitlab.com/blog/memory-safe-vs-unsafe/",[],"How to secure memory-safe vs. manually managed languages",[340,341,342],"style",{},"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);}",{"title":221,"searchDepth":344,"depth":344,"links":345},2,[346,347,348,349,350,351,352,353],{"id":28,"depth":344,"text":29},{"id":83,"depth":344,"text":84},{"id":125,"depth":344,"text":126},{"id":160,"depth":344,"text":161},{"id":179,"depth":344,"text":180},{"id":203,"depth":344,"text":204},{"id":277,"depth":344,"text":278},{"id":312,"depth":344,"text":313},"ai","2024-12-11","Learn how to refactor code from memory unsafe languages to memory safe languages with the help of GitLab's AI capabilities, saving time and effort on application modernization.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg",{},true,"/en-us/blog/modernizing-a-simple-c-application-to-java-with-gitlab-duo",{"title":5,"description":356,"ogTitle":5,"ogDescription":356,"noIndex":359,"ogImage":360,"ogUrl":365,"ogSiteName":366,"ogType":367,"canonicalUrls":365},"https://about.gitlab.com/blog/modernizing-a-simple-c-application-to-java-with-gitlab-duo","https://about.gitlab.com","article","modernizing-a-simple-c-application-to-java-with-gitlab-duo","en-us/blog/modernizing-a-simple-c-application-to-java-with-gitlab-duo",[371,372,373,374],"AI","DevSecOps platform","tutorial","public sector","BlogPost","cSGMPadAmgxRFuyU_Zsb4DfOGL5dLf9taWKW630_WgM",{"logo":378,"freeTrial":383,"sales":388,"login":393,"items":398,"search":723,"minimal":754,"duo":773,"switchNav":782,"pricingDeployment":793},{"config":379},{"href":380,"dataGaName":381,"dataGaLocation":382},"/","gitlab logo","header",{"text":384,"config":385},"Get free trial",{"href":386,"dataGaName":387,"dataGaLocation":382},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":389,"config":390},"Request a demo",{"href":391,"dataGaName":392,"dataGaLocation":382},"/sales/?contact-topic=request-demo","sales",{"text":394,"config":395},"Sign in",{"href":396,"dataGaName":397,"dataGaLocation":382},"https://gitlab.com/users/sign_in/","sign in",[399,427,526,531,645,701],{"text":400,"config":401,"menu":403},"Platform",{"dataNavLevelOne":402},"platform",{"type":404,"columns":405},"cards",[406,412,420],{"title":400,"description":407,"link":408},"The intelligent orchestration platform for DevSecOps",{"text":409,"config":410},"Explore our Platform",{"href":411,"dataGaName":402,"dataGaLocation":382},"/platform/",{"title":413,"description":414,"link":415},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":416,"config":417},"Meet GitLab Duo",{"href":418,"dataGaName":419,"dataGaLocation":382},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":421,"description":422,"link":423},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":313,"config":424},{"href":425,"dataGaName":426,"dataGaLocation":382},"/why-gitlab/","why gitlab",{"text":428,"left":362,"config":429,"menu":431},"Product",{"dataNavLevelOne":430},"solutions",{"type":432,"link":433,"columns":437,"feature":506},"lists",{"text":434,"config":435},"View all Solutions",{"href":436,"dataGaName":430,"dataGaLocation":382},"/solutions/",[438,462,485],{"title":439,"description":440,"link":441,"items":446},"Automation","CI/CD and automation to accelerate deployment",{"config":442},{"icon":443,"href":444,"dataGaName":445,"dataGaLocation":382},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[447,451,454,458],{"text":448,"config":449},"CI/CD",{"href":450,"dataGaLocation":382,"dataGaName":448},"/solutions/continuous-integration/",{"text":413,"config":452},{"href":418,"dataGaLocation":382,"dataGaName":453},"gitlab duo agent platform - product menu",{"text":455,"config":456},"Source Code Management",{"href":457,"dataGaLocation":382,"dataGaName":455},"/solutions/source-code-management/",{"text":459,"config":460},"Automated Software Delivery",{"href":444,"dataGaLocation":382,"dataGaName":461},"Automated software delivery",{"title":463,"description":464,"link":465,"items":470},"Security","Deliver code faster without compromising security",{"config":466},{"href":467,"dataGaName":468,"dataGaLocation":382,"icon":469},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[471,475,480],{"text":472,"config":473},"Application Security Testing",{"href":467,"dataGaName":474,"dataGaLocation":382},"Application security testing",{"text":476,"config":477},"Software Supply Chain Security",{"href":478,"dataGaLocation":382,"dataGaName":479},"/solutions/supply-chain/","Software supply chain security",{"text":481,"config":482},"Software Compliance",{"href":483,"dataGaName":484,"dataGaLocation":382},"/solutions/software-compliance/","software compliance",{"title":486,"link":487,"items":492},"Measurement",{"config":488},{"icon":489,"href":490,"dataGaName":491,"dataGaLocation":382},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[493,497,501],{"text":494,"config":495},"Visibility & Measurement",{"href":490,"dataGaLocation":382,"dataGaName":496},"Visibility and Measurement",{"text":498,"config":499},"Value Stream Management",{"href":500,"dataGaLocation":382,"dataGaName":498},"/solutions/value-stream-management/",{"text":502,"config":503},"Analytics & Insights",{"href":504,"dataGaLocation":382,"dataGaName":505},"/solutions/analytics-and-insights/","Analytics and insights",{"title":507,"type":432,"items":508},"GitLab for",[509,515,521],{"text":510,"config":511},"Enterprise",{"icon":512,"href":513,"dataGaLocation":382,"dataGaName":514},"Building","/enterprise/","enterprise",{"text":516,"config":517},"Small Business",{"icon":518,"href":519,"dataGaLocation":382,"dataGaName":520},"Work","/small-business/","small business",{"text":522,"config":523},"Public Sector",{"icon":524,"href":525,"dataGaLocation":382,"dataGaName":374},"Organization","/solutions/public-sector/",{"text":527,"config":528},"Pricing",{"href":529,"dataGaName":530,"dataGaLocation":382,"dataNavLevelOne":530},"/pricing/","pricing",{"text":532,"config":533,"menu":535},"Resources",{"dataNavLevelOne":534},"resources",{"type":432,"link":536,"columns":540,"feature":634},{"text":537,"config":538},"View all resources",{"href":539,"dataGaName":534,"dataGaLocation":382},"/resources/",[541,574,601],{"title":542,"items":543},"Getting started",[544,549,554,559,564,569],{"text":545,"config":546},"Install",{"href":547,"dataGaName":548,"dataGaLocation":382},"/install/","install",{"text":550,"config":551},"Quick start guides",{"href":552,"dataGaName":553,"dataGaLocation":382},"/get-started/","quick setup checklists",{"text":555,"config":556},"Learn",{"href":557,"dataGaLocation":382,"dataGaName":558},"https://university.gitlab.com/","learn",{"text":560,"config":561},"Product documentation",{"href":562,"dataGaName":563,"dataGaLocation":382},"https://docs.gitlab.com/","product documentation",{"text":565,"config":566},"Best practice videos",{"href":567,"dataGaName":568,"dataGaLocation":382},"/getting-started-videos/","best practice videos",{"text":570,"config":571},"Integrations",{"href":572,"dataGaName":573,"dataGaLocation":382},"/integrations/","integrations",{"title":575,"items":576},"Discover",[577,582,587,592,596],{"text":578,"config":579},"Customer success stories",{"href":580,"dataGaName":581,"dataGaLocation":382},"/customers/","customer success stories",{"text":583,"config":584},"Blog",{"href":585,"dataGaName":586,"dataGaLocation":382},"/blog/","blog",{"text":588,"config":589},"Demo Hub",{"href":590,"dataGaName":591,"dataGaLocation":382},"/demo-hub/","demo hub",{"text":593,"config":594},"The Source",{"href":595,"dataGaName":586,"dataGaLocation":382},"/the-source/",{"text":597,"config":598},"Remote",{"href":599,"dataGaName":600,"dataGaLocation":382},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":602,"items":603},"Connect",[604,609,614,619,624,629],{"text":605,"config":606},"GitLab Services",{"href":607,"dataGaName":608,"dataGaLocation":382},"/services/","services",{"text":610,"config":611},"Contribute",{"href":612,"dataGaName":613,"dataGaLocation":382},"https://contributors.gitlab.com","contribute",{"text":615,"config":616},"Community",{"href":617,"dataGaName":618,"dataGaLocation":382},"/community/","community",{"text":620,"config":621},"Forum",{"href":622,"dataGaName":623,"dataGaLocation":382},"https://forum.gitlab.com/","forum",{"text":625,"config":626},"Events",{"href":627,"dataGaName":628,"dataGaLocation":382},"/events/","events",{"text":630,"config":631},"Partners",{"href":632,"dataGaName":633,"dataGaLocation":382},"/partners/","partners",{"config":635,"title":638,"text":639,"link":640},{"background":636,"textColor":637},"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":641,"config":642},"Read the latest",{"href":643,"dataGaName":644,"dataGaLocation":382},"/whats-new/","whats new",{"text":646,"config":647,"menu":649},"Company",{"dataNavLevelOne":648},"company",{"type":432,"columns":650},[651],{"items":652},[653,658,664,666,671,676,681,686,691,696],{"text":654,"config":655},"About",{"href":656,"dataGaName":657,"dataGaLocation":382},"/company/","about",{"text":659,"config":660,"footerGa":663},"Jobs",{"href":661,"dataGaName":662,"dataGaLocation":382},"/jobs/","jobs",{"dataGaName":662},{"text":625,"config":665},{"href":627,"dataGaName":628,"dataGaLocation":382},{"text":667,"config":668},"Leadership",{"href":669,"dataGaName":670,"dataGaLocation":382},"/company/team/e-group/","leadership",{"text":672,"config":673},"Handbook",{"href":674,"dataGaName":675,"dataGaLocation":382},"https://handbook.gitlab.com/","handbook",{"text":677,"config":678},"Investor relations",{"href":679,"dataGaName":680,"dataGaLocation":382},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":682,"config":683},"Trust Center",{"href":684,"dataGaName":685,"dataGaLocation":382},"/security/","trust center",{"text":687,"config":688},"AI Transparency Center",{"href":689,"dataGaName":690,"dataGaLocation":382},"/ai-transparency-center/","ai transparency center",{"text":692,"config":693},"Newsletter",{"href":694,"dataGaName":695,"dataGaLocation":382},"/company/contact/#contact-forms","newsletter",{"text":697,"config":698},"Press",{"href":699,"dataGaName":700,"dataGaLocation":382},"/press/","press",{"text":702,"config":703,"menu":704},"Contact us",{"dataNavLevelOne":648},{"type":432,"columns":705},[706],{"items":707},[708,713,718],{"text":709,"config":710},"Talk to sales",{"href":711,"dataGaName":712,"dataGaLocation":382},"/sales/","talk to sales",{"text":714,"config":715},"Support portal",{"href":716,"dataGaName":717,"dataGaLocation":382},"https://support.gitlab.com/hc/en-us","support portal",{"text":719,"config":720},"Customer portal",{"href":721,"dataGaName":722,"dataGaLocation":382},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":724,"login":725,"suggestions":732},"Close",{"text":726,"link":727},"To search repositories and projects, login to",{"text":728,"config":729},"gitlab.com",{"href":396,"dataGaName":730,"dataGaLocation":731},"search login","search",{"text":733,"default":734},"Suggestions",[735,737,741,743,747,751],{"text":413,"config":736},{"href":418,"dataGaName":413,"dataGaLocation":731},{"text":738,"config":739},"Code Suggestions (AI)",{"href":740,"dataGaName":738,"dataGaLocation":731},"/solutions/code-suggestions/",{"text":448,"config":742},{"href":450,"dataGaName":448,"dataGaLocation":731},{"text":744,"config":745},"GitLab on AWS",{"href":746,"dataGaName":744,"dataGaLocation":731},"/partners/technology-partners/aws/",{"text":748,"config":749},"GitLab on Google Cloud",{"href":750,"dataGaName":748,"dataGaLocation":731},"/partners/technology-partners/google-cloud-platform/",{"text":752,"config":753},"Why GitLab?",{"href":425,"dataGaName":752,"dataGaLocation":731},{"freeTrial":755,"mobileIcon":760,"desktopIcon":765,"secondaryButton":768},{"text":756,"config":757},"Start free trial",{"href":758,"dataGaName":387,"dataGaLocation":759},"https://gitlab.com/-/trials/new/","nav",{"altText":761,"config":762},"Gitlab Icon",{"src":763,"dataGaName":764,"dataGaLocation":759},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":761,"config":766},{"src":767,"dataGaName":764,"dataGaLocation":759},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":769,"config":770},"Get Started",{"href":771,"dataGaName":772,"dataGaLocation":759},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":774,"mobileIcon":778,"desktopIcon":780},{"text":775,"config":776},"Learn more about GitLab Duo",{"href":418,"dataGaName":777,"dataGaLocation":759},"gitlab duo",{"altText":761,"config":779},{"src":763,"dataGaName":764,"dataGaLocation":759},{"altText":761,"config":781},{"src":767,"dataGaName":764,"dataGaLocation":759},{"button":783,"mobileIcon":788,"desktopIcon":790},{"text":784,"config":785},"/switch",{"href":786,"dataGaName":787,"dataGaLocation":759},"#contact","switch",{"altText":761,"config":789},{"src":763,"dataGaName":764,"dataGaLocation":759},{"altText":761,"config":791},{"src":792,"dataGaName":764,"dataGaLocation":759},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":794,"mobileIcon":799,"desktopIcon":801},{"text":795,"config":796},"Back to pricing",{"href":529,"dataGaName":797,"dataGaLocation":759,"icon":798},"back to pricing","GoBack",{"altText":761,"config":800},{"src":763,"dataGaName":764,"dataGaLocation":759},{"altText":761,"config":802},{"src":767,"dataGaName":764,"dataGaLocation":759},{"title":804,"titleMobile":805,"button":806,"config":811},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":313,"config":807},{"href":808,"dataGaName":809,"dataGaLocation":810},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":812,"disabled":359},"release",{"data":814},{"text":815,"source":816,"edit":822,"contribute":827,"config":832,"items":837,"minimal":1046},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":817,"config":818},"View page source",{"href":819,"dataGaName":820,"dataGaLocation":821},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":823,"config":824},"Edit this page",{"href":825,"dataGaName":826,"dataGaLocation":821},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":828,"config":829},"Please contribute",{"href":830,"dataGaName":831,"dataGaLocation":821},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":833,"facebook":834,"youtube":835,"linkedin":836},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[838,885,938,982,1014],{"title":527,"links":839,"subMenu":854},[840,844,849],{"text":841,"config":842},"View plans",{"href":529,"dataGaName":843,"dataGaLocation":821},"view plans",{"text":845,"config":846},"Why Premium?",{"href":847,"dataGaName":848,"dataGaLocation":821},"/pricing/premium/","why premium",{"text":850,"config":851},"Why Ultimate?",{"href":852,"dataGaName":853,"dataGaLocation":821},"/pricing/ultimate/","why ultimate",[855],{"title":856,"links":857},"Contact Us",[858,861,863,865,870,875,880],{"text":859,"config":860},"Contact sales",{"href":711,"dataGaName":392,"dataGaLocation":821},{"text":714,"config":862},{"href":716,"dataGaName":717,"dataGaLocation":821},{"text":719,"config":864},{"href":721,"dataGaName":722,"dataGaLocation":821},{"text":866,"config":867},"Status",{"href":868,"dataGaName":869,"dataGaLocation":821},"https://status.gitlab.com/","status",{"text":871,"config":872},"Terms of use",{"href":873,"dataGaName":874,"dataGaLocation":821},"/terms/","terms of use",{"text":876,"config":877},"Privacy statement",{"href":878,"dataGaName":879,"dataGaLocation":821},"/privacy/","privacy statement",{"text":881,"config":882},"Cookie preferences",{"dataGaName":883,"dataGaLocation":821,"id":884,"isOneTrustButton":362},"cookie preferences","ot-sdk-btn",{"title":428,"links":886,"subMenu":894},[887,890],{"text":372,"config":888},{"href":411,"dataGaName":889,"dataGaLocation":821},"devsecops platform",{"text":891,"config":892},"AI-Assisted Development",{"href":418,"dataGaName":893,"dataGaLocation":821},"ai-assisted development",[895],{"title":896,"links":897},"Topics",[898,903,908,913,918,923,928,933],{"text":899,"config":900},"CICD",{"href":901,"dataGaName":902,"dataGaLocation":821},"/topics/ci-cd/","cicd",{"text":904,"config":905},"GitOps",{"href":906,"dataGaName":907,"dataGaLocation":821},"/topics/gitops/","gitops",{"text":909,"config":910},"DevOps",{"href":911,"dataGaName":912,"dataGaLocation":821},"/topics/devops/","devops",{"text":914,"config":915},"Version Control",{"href":916,"dataGaName":917,"dataGaLocation":821},"/topics/version-control/","version control",{"text":919,"config":920},"DevSecOps",{"href":921,"dataGaName":922,"dataGaLocation":821},"/topics/devsecops/","devsecops",{"text":924,"config":925},"Cloud Native",{"href":926,"dataGaName":927,"dataGaLocation":821},"/topics/cloud-native/","cloud native",{"text":929,"config":930},"AI for Coding",{"href":931,"dataGaName":932,"dataGaLocation":821},"/topics/devops/ai-for-coding/","ai for coding",{"text":934,"config":935},"Agentic AI",{"href":936,"dataGaName":937,"dataGaLocation":821},"/topics/agentic-ai/","agentic ai",{"title":939,"links":940},"Solutions",[941,943,945,950,954,957,961,964,966,969,972,977],{"text":472,"config":942},{"href":467,"dataGaName":472,"dataGaLocation":821},{"text":461,"config":944},{"href":444,"dataGaName":445,"dataGaLocation":821},{"text":946,"config":947},"Agile development",{"href":948,"dataGaName":949,"dataGaLocation":821},"/solutions/agile-delivery/","agile delivery",{"text":951,"config":952},"SCM",{"href":457,"dataGaName":953,"dataGaLocation":821},"source code management",{"text":899,"config":955},{"href":450,"dataGaName":956,"dataGaLocation":821},"continuous integration & delivery",{"text":958,"config":959},"Value stream management",{"href":500,"dataGaName":960,"dataGaLocation":821},"value stream management",{"text":904,"config":962},{"href":963,"dataGaName":907,"dataGaLocation":821},"/solutions/gitops/",{"text":510,"config":965},{"href":513,"dataGaName":514,"dataGaLocation":821},{"text":967,"config":968},"Small business",{"href":519,"dataGaName":520,"dataGaLocation":821},{"text":970,"config":971},"Public sector",{"href":525,"dataGaName":374,"dataGaLocation":821},{"text":973,"config":974},"Education",{"href":975,"dataGaName":976,"dataGaLocation":821},"/solutions/education/","education",{"text":978,"config":979},"Financial services",{"href":980,"dataGaName":981,"dataGaLocation":821},"/solutions/finance/","financial services",{"title":532,"links":983},[984,986,988,990,993,995,998,1000,1002,1004,1006,1008,1010,1012],{"text":545,"config":985},{"href":547,"dataGaName":548,"dataGaLocation":821},{"text":550,"config":987},{"href":552,"dataGaName":553,"dataGaLocation":821},{"text":555,"config":989},{"href":557,"dataGaName":558,"dataGaLocation":821},{"text":560,"config":991},{"href":562,"dataGaName":992,"dataGaLocation":821},"docs",{"text":583,"config":994},{"href":585,"dataGaName":586,"dataGaLocation":821},{"text":996,"config":997},"What's new",{"href":643,"dataGaName":644,"dataGaLocation":821},{"text":578,"config":999},{"href":580,"dataGaName":581,"dataGaLocation":821},{"text":597,"config":1001},{"href":599,"dataGaName":600,"dataGaLocation":821},{"text":605,"config":1003},{"href":607,"dataGaName":608,"dataGaLocation":821},{"text":610,"config":1005},{"href":612,"dataGaName":613,"dataGaLocation":821},{"text":615,"config":1007},{"href":617,"dataGaName":618,"dataGaLocation":821},{"text":620,"config":1009},{"href":622,"dataGaName":623,"dataGaLocation":821},{"text":625,"config":1011},{"href":627,"dataGaName":628,"dataGaLocation":821},{"text":630,"config":1013},{"href":632,"dataGaName":633,"dataGaLocation":821},{"title":646,"links":1015},[1016,1018,1020,1022,1024,1026,1030,1035,1037,1039,1041],{"text":654,"config":1017},{"href":656,"dataGaName":648,"dataGaLocation":821},{"text":659,"config":1019},{"href":661,"dataGaName":662,"dataGaLocation":821},{"text":667,"config":1021},{"href":669,"dataGaName":670,"dataGaLocation":821},{"text":672,"config":1023},{"href":674,"dataGaName":675,"dataGaLocation":821},{"text":677,"config":1025},{"href":679,"dataGaName":680,"dataGaLocation":821},{"text":1027,"config":1028},"Sustainability",{"href":1029,"dataGaName":1027,"dataGaLocation":821},"/sustainability/",{"text":1031,"config":1032},"Diversity, inclusion and belonging (DIB)",{"href":1033,"dataGaName":1034,"dataGaLocation":821},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":682,"config":1036},{"href":684,"dataGaName":685,"dataGaLocation":821},{"text":692,"config":1038},{"href":694,"dataGaName":695,"dataGaLocation":821},{"text":697,"config":1040},{"href":699,"dataGaName":700,"dataGaLocation":821},{"text":1042,"config":1043},"Modern Slavery Transparency Statement",{"href":1044,"dataGaName":1045,"dataGaLocation":821},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1047},[1048,1051,1054],{"text":1049,"config":1050},"Terms",{"href":873,"dataGaName":874,"dataGaLocation":821},{"text":1052,"config":1053},"Cookies",{"dataGaName":883,"dataGaLocation":821,"id":884,"isOneTrustButton":362},{"text":1055,"config":1056},"Privacy",{"href":878,"dataGaName":879,"dataGaLocation":821},[1058],{"id":1059,"title":7,"body":358,"config":1060,"content":1062,"description":358,"extension":1066,"meta":1067,"navigation":362,"path":1068,"seo":1069,"stem":1070,"__hash__":1071},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":1061},"BlogAuthor",{"name":7,"config":1063},{"headshot":1064,"ctfId":1065},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1","yml",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[1073,1081,1089],{"title":1074,"description":1075,"heroImage":1076,"category":354,"date":1077,"authors":1078,"slug":1080,"externalUrl":358},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[1079],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1082,"description":1083,"heroImage":1084,"category":354,"date":1085,"authors":1086,"slug":1088,"externalUrl":358},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[1087],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1090,"description":1091,"heroImage":1092,"category":354,"date":1093,"authors":1094,"slug":1096,"externalUrl":358},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[1095],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1098},[1099,1112,1124,1136],{"id":1100,"categories":1101,"header":1102,"text":1103,"button":1104,"image":1109},"ai-modernization",[354],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1105,"config":1106},"Get your AI maturity score",{"href":1107,"dataGaName":1108,"dataGaLocation":586},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1110},{"src":1111},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1113,"categories":1114,"header":1116,"text":1103,"button":1117,"image":1121},"devops-modernization",[1115,922],"product","Are you just managing tools or shipping innovation?",{"text":1118,"config":1119},"Get your DevOps maturity score",{"href":1120,"dataGaName":1108,"dataGaLocation":586},"/assessments/devops-modernization-assessment/",{"config":1122},{"src":1123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1125,"categories":1126,"header":1128,"text":1103,"button":1129,"image":1133},"security-modernization",[1127],"security","Are you trading speed for security?",{"text":1130,"config":1131},"Get your security maturity score",{"href":1132,"dataGaName":1108,"dataGaLocation":586},"/assessments/security-modernization-assessment/",{"config":1134},{"src":1135},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1137,"paths":1138,"header":1141,"text":1142,"button":1143,"image":1148},"github-azure-migration",[1139,1140],"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":1144,"config":1145},"See how GitLab compares to GitHub",{"href":1146,"dataGaName":1147,"dataGaLocation":586},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1149},{"src":1123},{"header":1151,"blurb":1152,"button":1153,"secondaryButton":1158},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1154,"config":1155},"Get your free trial",{"href":1156,"dataGaName":387,"dataGaLocation":1157},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":859,"config":1159},{"href":711,"dataGaName":392,"dataGaLocation":1157},1786803763977]