[{"data":1,"prerenderedAt":970},["ShallowReactive",2],{"/blog/how-to-automate-localization-for-flutter-apps":3,"navigation-en-us":183,"banner-en-us":611,"footer-en-us":621,"blog-post-authors-en-us-GitLab":865,"blog-related-posts-en-us-how-to-automate-localization-for-flutter-apps":880,"blog-promotions-en-us":906,"next-steps-en-us":960},{"id":4,"title":5,"authors":6,"body":8,"category":161,"date":162,"description":163,"extension":164,"externalUrl":165,"faq":165,"featured":166,"heroImage":167,"meta":168,"navigation":169,"path":170,"seo":171,"slug":175,"stem":176,"tags":177,"template":181,"updatedDate":165,"__hash__":182},"blogPosts/en-us/blog/how-to-automate-localization-for-flutter-apps.md","How to automate localization for Flutter apps",[7],"GitLab",{"type":9,"value":10,"toc":153},"minimark",[11,15,25,30,33,36,43,52,56,59,81,84,88,91,114,117,120,143,146,150],[12,13,14],"p",{},"Localization is an indispensable part of today's software. Almost all successful companies strive to adapt their products to different languages, regions, and cultures. Customer satisfaction is crucial for business. However, that often comes at a cost in terms of the higher complexity in software development and maintenance. In addition to regular activities, you must also take care of translation, its synchronization with development processes, and the like.",[12,16,17,18,24],{},"The question is: Can we somehow simplify the localization process and make it more agile? The answer is “yes.\" Below, you can see how GitLab and the ",[19,20,23],"a",{"href":21,"rel":22},"https://localizely.com/",[],"Localizely"," platform can help. For that purpose, we will use a simple Flutter project. However, the same approach can be applied to other programming languages and frameworks.",[26,27,29],"h2",{"id":28},"a-few-words-about-the-flutter-project","A few words about the Flutter project",[12,31,32],{},"Flutter is an open-source framework developed by Google for building multi-platform apps from a single codebase. It has become quite popular lately, as it solves some things much better than some other solutions (hot-reload, performance, etc.). Since the point of this post is the automation of localization, we will not deal with Flutter too much. But we will certainly highlight some important things regarding localization in Flutter projects.",[12,34,35],{},"Whatever approach you used to create and localize your Flutter project, its structure would probably be similar to the one below.",[12,37,38],{},[39,40],"img",{"alt":41,"src":42},"Flutter project structure","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398282/blog/Content%20Images/fluttergraphic.png",[12,44,45,46,51],{},"Above, you can see the l10n folder with the two ",[19,47,50],{"href":48,"rel":49},"https://localizely.com/flutter-arb/",[],"ARB"," files. Each ARB file contains translations for one language in the Flutter project (i.e. intl_de.arb for German and intl_en.arb for English). Whenever we want to add, modify, or remove a translation, we need to update those files. In other words, those files are the basis of localization in Flutter projects. They separate programming from translation but require synchronization with your code so that each message has a corresponding translation.",[26,53,55],{"id":54},"the-usual-way-of-localization","The usual way of localization",[12,57,58],{},"There is no exact rule or process that describes the usual way of localization. However, we could roughly describe it as the routine of a few steps:",[60,61,62,66,69,72,75,78],"ol",{},[63,64,65],"li",{},"The developer updates code and the main ARB file.",[63,67,68],{},"The developer sends ARB files to the project manager.",[63,70,71],{},"The project manager sends ARB files to translators (e.g. email, upload to localization platform, etc.).",[63,73,74],{},"The translators work on translations.",[63,76,77],{},"The project manager forwards translated ARB files to the developer.",[63,79,80],{},"The developer updates the Flutter project with new translations.",[12,82,83],{},"In this simplified case of localization, we can already notice some tasks that drain a lot of time and can be a bottleneck. Those are steps 2, 3, and 5. Moreover, these six steps can be frequent (e.g. update of the UI, new feature, etc.), which is not exactly the optimal solution. And that is even truer for medium and large teams. Just imagine how much time is wasted on file sharing when you have to coordinate in a team of 10+ people. Not to mention the problem with outdated ARB files.",[26,85,87],{"id":86},"automated-localization","Automated localization",[12,89,90],{},"Since you've seen some flaws in the usual way of localization, let's see how we can optimize that.",[60,92,93,96,99,102,111],{},[63,94,95],{},"The developer updates code, the main ARB file, and pushes changes to GitLab.",[63,97,98],{},"GitLab informs Localizely via webhook regarding new changes.",[63,100,101],{},"Localizely fetches ARB files from GitLab and lets translators work on translations.",[63,103,104,105,110],{},"The project manager pushes updated ARB files to GitLab via ",[19,106,109],{"href":107,"rel":108},"https://docs.gitlab.com/user/project/merge_requests/",[],"MR",".",[63,112,113],{},"The developer updates the Flutter project with new translations (merge MR).",[12,115,116],{},"This way of working enables everyone to do their job more efficiently. Developers can be focused on the development of the product, translators on translations, managers on management, and similar. It should also be noted that with this type of workflow, you can easily accelerate the development and delivery of new features, which is in everyone's interest.",[12,118,119],{},"To make this workflow possible, you need to adjust a few things. In the following, you can see the necessary settings.",[60,121,122,131,140],{},[63,123,124,125,130],{},"Add a ",[19,126,129],{"href":127,"rel":128},"https://localizely.com/configuration-file/",[],"localizely.yml"," config file to the root of your Flutter project.",[63,132,133,134,139],{},"Set up ",[19,135,138],{"href":136,"rel":137},"https://localizely.com/gitlab-integration/",[],"GitLab integration"," on the Localizely platform.",[63,141,142],{},"Add a webhook to the GitLab repository.",[12,144,145],{},"And that’s all. You have automated localization on your Flutter project. Whenever the developer pushes the changes to GitLab, the translators will see new string keys on the Localizely. Once the translation is done, a single click on the button creates a new MR with the latest translations on GitLab. There is no need for a mediator, waiting, or sending ARB files for every little thing. Now you can have more time for other things as this tedious work is automated.",[26,147,149],{"id":148},"final-thoughts","Final thoughts",[12,151,152],{},"In this post, you have seen the most common steps of localization in Flutter projects and how to automate some of them. Knowing how important efficiency is today, we should strive to automate repetitive tasks as much as possible. As someone once said, “Lost time is never found again”.",{"title":154,"searchDepth":155,"depth":155,"links":156},"",2,[157,158,159,160],{"id":28,"depth":155,"text":29},{"id":54,"depth":155,"text":55},{"id":86,"depth":155,"text":87},{"id":148,"depth":155,"text":149},"engineering","2021-12-10","Follow this tutorial to learn how to simplify the localization process on GitLab with Localizely.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679465/Blog/Hero%20Images/flutterbanner.png",{},true,"/en-us/blog/how-to-automate-localization-for-flutter-apps",{"title":5,"description":163,"ogTitle":5,"ogDescription":163,"noIndex":166,"ogImage":167,"ogUrl":172,"ogSiteName":173,"ogType":174,"canonicalUrls":172},"https://about.gitlab.com/blog/how-to-automate-localization-for-flutter-apps","https://about.gitlab.com","article","how-to-automate-localization-for-flutter-apps","en-us/blog/how-to-automate-localization-for-flutter-apps",[178,179,180],"DevOps","production","tutorial","BlogPost","V1Yjn9QXvz1ZIas4xxfm3nU2mOrjb8R3Cnc16aX8rE8",{"logo":184,"freeTrial":189,"sales":194,"login":199,"items":204,"search":531,"minimal":562,"duo":581,"switchNav":590,"pricingDeployment":601},{"config":185},{"href":186,"dataGaName":187,"dataGaLocation":188},"/","gitlab logo","header",{"text":190,"config":191},"Get free trial",{"href":192,"dataGaName":193,"dataGaLocation":188},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":195,"config":196},"Request a demo",{"href":197,"dataGaName":198,"dataGaLocation":188},"/sales/?contact-topic=request-demo","sales",{"text":200,"config":201},"Sign in",{"href":202,"dataGaName":203,"dataGaLocation":188},"https://gitlab.com/users/sign_in/","sign in",[205,234,334,339,453,509],{"text":206,"config":207,"menu":209},"Platform",{"dataNavLevelOne":208},"platform",{"type":210,"columns":211},"cards",[212,218,226],{"title":206,"description":213,"link":214},"The intelligent orchestration platform for DevSecOps",{"text":215,"config":216},"Explore our Platform",{"href":217,"dataGaName":208,"dataGaLocation":188},"/platform/",{"title":219,"description":220,"link":221},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":222,"config":223},"Meet GitLab Duo",{"href":224,"dataGaName":225,"dataGaLocation":188},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":227,"description":228,"link":229},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":230,"config":231},"Learn more",{"href":232,"dataGaName":233,"dataGaLocation":188},"/why-gitlab/","why gitlab",{"text":235,"left":169,"config":236,"menu":238},"Product",{"dataNavLevelOne":237},"solutions",{"type":239,"link":240,"columns":244,"feature":313},"lists",{"text":241,"config":242},"View all Solutions",{"href":243,"dataGaName":237,"dataGaLocation":188},"/solutions/",[245,269,292],{"title":246,"description":247,"link":248,"items":253},"Automation","CI/CD and automation to accelerate deployment",{"config":249},{"icon":250,"href":251,"dataGaName":252,"dataGaLocation":188},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[254,258,261,265],{"text":255,"config":256},"CI/CD",{"href":257,"dataGaLocation":188,"dataGaName":255},"/solutions/continuous-integration/",{"text":219,"config":259},{"href":224,"dataGaLocation":188,"dataGaName":260},"gitlab duo agent platform - product menu",{"text":262,"config":263},"Source Code Management",{"href":264,"dataGaLocation":188,"dataGaName":262},"/solutions/source-code-management/",{"text":266,"config":267},"Automated Software Delivery",{"href":251,"dataGaLocation":188,"dataGaName":268},"Automated software delivery",{"title":270,"description":271,"link":272,"items":277},"Security","Deliver code faster without compromising security",{"config":273},{"href":274,"dataGaName":275,"dataGaLocation":188,"icon":276},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[278,282,287],{"text":279,"config":280},"Application Security Testing",{"href":274,"dataGaName":281,"dataGaLocation":188},"Application security testing",{"text":283,"config":284},"Software Supply Chain Security",{"href":285,"dataGaLocation":188,"dataGaName":286},"/solutions/supply-chain/","Software supply chain security",{"text":288,"config":289},"Software Compliance",{"href":290,"dataGaName":291,"dataGaLocation":188},"/solutions/software-compliance/","software compliance",{"title":293,"link":294,"items":299},"Measurement",{"config":295},{"icon":296,"href":297,"dataGaName":298,"dataGaLocation":188},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[300,304,308],{"text":301,"config":302},"Visibility & Measurement",{"href":297,"dataGaLocation":188,"dataGaName":303},"Visibility and Measurement",{"text":305,"config":306},"Value Stream Management",{"href":307,"dataGaLocation":188,"dataGaName":305},"/solutions/value-stream-management/",{"text":309,"config":310},"Analytics & Insights",{"href":311,"dataGaLocation":188,"dataGaName":312},"/solutions/analytics-and-insights/","Analytics and insights",{"title":314,"type":239,"items":315},"GitLab for",[316,322,328],{"text":317,"config":318},"Enterprise",{"icon":319,"href":320,"dataGaLocation":188,"dataGaName":321},"Building","/enterprise/","enterprise",{"text":323,"config":324},"Small Business",{"icon":325,"href":326,"dataGaLocation":188,"dataGaName":327},"Work","/small-business/","small business",{"text":329,"config":330},"Public Sector",{"icon":331,"href":332,"dataGaLocation":188,"dataGaName":333},"Organization","/solutions/public-sector/","public sector",{"text":335,"config":336},"Pricing",{"href":337,"dataGaName":338,"dataGaLocation":188,"dataNavLevelOne":338},"/pricing/","pricing",{"text":340,"config":341,"menu":343},"Resources",{"dataNavLevelOne":342},"resources",{"type":239,"link":344,"columns":348,"feature":442},{"text":345,"config":346},"View all resources",{"href":347,"dataGaName":342,"dataGaLocation":188},"/resources/",[349,382,409],{"title":350,"items":351},"Getting started",[352,357,362,367,372,377],{"text":353,"config":354},"Install",{"href":355,"dataGaName":356,"dataGaLocation":188},"/install/","install",{"text":358,"config":359},"Quick start guides",{"href":360,"dataGaName":361,"dataGaLocation":188},"/get-started/","quick setup checklists",{"text":363,"config":364},"Learn",{"href":365,"dataGaLocation":188,"dataGaName":366},"https://university.gitlab.com/","learn",{"text":368,"config":369},"Product documentation",{"href":370,"dataGaName":371,"dataGaLocation":188},"https://docs.gitlab.com/","product documentation",{"text":373,"config":374},"Best practice videos",{"href":375,"dataGaName":376,"dataGaLocation":188},"/getting-started-videos/","best practice videos",{"text":378,"config":379},"Integrations",{"href":380,"dataGaName":381,"dataGaLocation":188},"/integrations/","integrations",{"title":383,"items":384},"Discover",[385,390,395,400,404],{"text":386,"config":387},"Customer success stories",{"href":388,"dataGaName":389,"dataGaLocation":188},"/customers/","customer success stories",{"text":391,"config":392},"Blog",{"href":393,"dataGaName":394,"dataGaLocation":188},"/blog/","blog",{"text":396,"config":397},"Demo Hub",{"href":398,"dataGaName":399,"dataGaLocation":188},"/demo-hub/","demo hub",{"text":401,"config":402},"The Source",{"href":403,"dataGaName":394,"dataGaLocation":188},"/the-source/",{"text":405,"config":406},"Remote",{"href":407,"dataGaName":408,"dataGaLocation":188},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":410,"items":411},"Connect",[412,417,422,427,432,437],{"text":413,"config":414},"GitLab Services",{"href":415,"dataGaName":416,"dataGaLocation":188},"/services/","services",{"text":418,"config":419},"Contribute",{"href":420,"dataGaName":421,"dataGaLocation":188},"https://contributors.gitlab.com","contribute",{"text":423,"config":424},"Community",{"href":425,"dataGaName":426,"dataGaLocation":188},"/community/","community",{"text":428,"config":429},"Forum",{"href":430,"dataGaName":431,"dataGaLocation":188},"https://forum.gitlab.com/","forum",{"text":433,"config":434},"Events",{"href":435,"dataGaName":436,"dataGaLocation":188},"/events/","events",{"text":438,"config":439},"Partners",{"href":440,"dataGaName":441,"dataGaLocation":188},"/partners/","partners",{"config":443,"title":446,"text":447,"link":448},{"background":444,"textColor":445},"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":449,"config":450},"Read the latest",{"href":451,"dataGaName":452,"dataGaLocation":188},"/whats-new/","whats new",{"text":454,"config":455,"menu":457},"Company",{"dataNavLevelOne":456},"company",{"type":239,"columns":458},[459],{"items":460},[461,466,472,474,479,484,489,494,499,504],{"text":462,"config":463},"About",{"href":464,"dataGaName":465,"dataGaLocation":188},"/company/","about",{"text":467,"config":468,"footerGa":471},"Jobs",{"href":469,"dataGaName":470,"dataGaLocation":188},"/jobs/","jobs",{"dataGaName":470},{"text":433,"config":473},{"href":435,"dataGaName":436,"dataGaLocation":188},{"text":475,"config":476},"Leadership",{"href":477,"dataGaName":478,"dataGaLocation":188},"/company/team/e-group/","leadership",{"text":480,"config":481},"Handbook",{"href":482,"dataGaName":483,"dataGaLocation":188},"https://handbook.gitlab.com/","handbook",{"text":485,"config":486},"Investor relations",{"href":487,"dataGaName":488,"dataGaLocation":188},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":490,"config":491},"Trust Center",{"href":492,"dataGaName":493,"dataGaLocation":188},"/security/","trust center",{"text":495,"config":496},"AI Transparency Center",{"href":497,"dataGaName":498,"dataGaLocation":188},"/ai-transparency-center/","ai transparency center",{"text":500,"config":501},"Newsletter",{"href":502,"dataGaName":503,"dataGaLocation":188},"/company/contact/#contact-forms","newsletter",{"text":505,"config":506},"Press",{"href":507,"dataGaName":508,"dataGaLocation":188},"/press/","press",{"text":510,"config":511,"menu":512},"Contact us",{"dataNavLevelOne":456},{"type":239,"columns":513},[514],{"items":515},[516,521,526],{"text":517,"config":518},"Talk to sales",{"href":519,"dataGaName":520,"dataGaLocation":188},"/sales/","talk to sales",{"text":522,"config":523},"Support portal",{"href":524,"dataGaName":525,"dataGaLocation":188},"https://support.gitlab.com/hc/en-us","support portal",{"text":527,"config":528},"Customer portal",{"href":529,"dataGaName":530,"dataGaLocation":188},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":532,"login":533,"suggestions":540},"Close",{"text":534,"link":535},"To search repositories and projects, login to",{"text":536,"config":537},"gitlab.com",{"href":202,"dataGaName":538,"dataGaLocation":539},"search login","search",{"text":541,"default":542},"Suggestions",[543,545,549,551,555,559],{"text":219,"config":544},{"href":224,"dataGaName":219,"dataGaLocation":539},{"text":546,"config":547},"Code Suggestions (AI)",{"href":548,"dataGaName":546,"dataGaLocation":539},"/solutions/code-suggestions/",{"text":255,"config":550},{"href":257,"dataGaName":255,"dataGaLocation":539},{"text":552,"config":553},"GitLab on AWS",{"href":554,"dataGaName":552,"dataGaLocation":539},"/partners/technology-partners/aws/",{"text":556,"config":557},"GitLab on Google Cloud",{"href":558,"dataGaName":556,"dataGaLocation":539},"/partners/technology-partners/google-cloud-platform/",{"text":560,"config":561},"Why GitLab?",{"href":232,"dataGaName":560,"dataGaLocation":539},{"freeTrial":563,"mobileIcon":568,"desktopIcon":573,"secondaryButton":576},{"text":564,"config":565},"Start free trial",{"href":566,"dataGaName":193,"dataGaLocation":567},"https://gitlab.com/-/trials/new/","nav",{"altText":569,"config":570},"Gitlab Icon",{"src":571,"dataGaName":572,"dataGaLocation":567},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":569,"config":574},{"src":575,"dataGaName":572,"dataGaLocation":567},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":577,"config":578},"Get Started",{"href":579,"dataGaName":580,"dataGaLocation":567},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":582,"mobileIcon":586,"desktopIcon":588},{"text":583,"config":584},"Learn more about GitLab Duo",{"href":224,"dataGaName":585,"dataGaLocation":567},"gitlab duo",{"altText":569,"config":587},{"src":571,"dataGaName":572,"dataGaLocation":567},{"altText":569,"config":589},{"src":575,"dataGaName":572,"dataGaLocation":567},{"button":591,"mobileIcon":596,"desktopIcon":598},{"text":592,"config":593},"/switch",{"href":594,"dataGaName":595,"dataGaLocation":567},"#contact","switch",{"altText":569,"config":597},{"src":571,"dataGaName":572,"dataGaLocation":567},{"altText":569,"config":599},{"src":600,"dataGaName":572,"dataGaLocation":567},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":602,"mobileIcon":607,"desktopIcon":609},{"text":603,"config":604},"Back to pricing",{"href":337,"dataGaName":605,"dataGaLocation":567,"icon":606},"back to pricing","GoBack",{"altText":569,"config":608},{"src":571,"dataGaName":572,"dataGaLocation":567},{"altText":569,"config":610},{"src":575,"dataGaName":572,"dataGaLocation":567},{"title":612,"titleMobile":613,"button":614,"config":619},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":230,"config":615},{"href":616,"dataGaName":617,"dataGaLocation":618},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":620,"disabled":166},"release",{"data":622},{"text":623,"source":624,"edit":630,"contribute":635,"config":640,"items":645,"minimal":854},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":625,"config":626},"View page source",{"href":627,"dataGaName":628,"dataGaLocation":629},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":631,"config":632},"Edit this page",{"href":633,"dataGaName":634,"dataGaLocation":629},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":636,"config":637},"Please contribute",{"href":638,"dataGaName":639,"dataGaLocation":629},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":641,"facebook":642,"youtube":643,"linkedin":644},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[646,693,746,790,822],{"title":335,"links":647,"subMenu":662},[648,652,657],{"text":649,"config":650},"View plans",{"href":337,"dataGaName":651,"dataGaLocation":629},"view plans",{"text":653,"config":654},"Why Premium?",{"href":655,"dataGaName":656,"dataGaLocation":629},"/pricing/premium/","why premium",{"text":658,"config":659},"Why Ultimate?",{"href":660,"dataGaName":661,"dataGaLocation":629},"/pricing/ultimate/","why ultimate",[663],{"title":664,"links":665},"Contact Us",[666,669,671,673,678,683,688],{"text":667,"config":668},"Contact sales",{"href":519,"dataGaName":198,"dataGaLocation":629},{"text":522,"config":670},{"href":524,"dataGaName":525,"dataGaLocation":629},{"text":527,"config":672},{"href":529,"dataGaName":530,"dataGaLocation":629},{"text":674,"config":675},"Status",{"href":676,"dataGaName":677,"dataGaLocation":629},"https://status.gitlab.com/","status",{"text":679,"config":680},"Terms of use",{"href":681,"dataGaName":682,"dataGaLocation":629},"/terms/","terms of use",{"text":684,"config":685},"Privacy statement",{"href":686,"dataGaName":687,"dataGaLocation":629},"/privacy/","privacy statement",{"text":689,"config":690},"Cookie preferences",{"dataGaName":691,"dataGaLocation":629,"id":692,"isOneTrustButton":169},"cookie preferences","ot-sdk-btn",{"title":235,"links":694,"subMenu":703},[695,699],{"text":696,"config":697},"DevSecOps platform",{"href":217,"dataGaName":698,"dataGaLocation":629},"devsecops platform",{"text":700,"config":701},"AI-Assisted Development",{"href":224,"dataGaName":702,"dataGaLocation":629},"ai-assisted development",[704],{"title":705,"links":706},"Topics",[707,712,717,721,726,731,736,741],{"text":708,"config":709},"CICD",{"href":710,"dataGaName":711,"dataGaLocation":629},"/topics/ci-cd/","cicd",{"text":713,"config":714},"GitOps",{"href":715,"dataGaName":716,"dataGaLocation":629},"/topics/gitops/","gitops",{"text":178,"config":718},{"href":719,"dataGaName":720,"dataGaLocation":629},"/topics/devops/","devops",{"text":722,"config":723},"Version Control",{"href":724,"dataGaName":725,"dataGaLocation":629},"/topics/version-control/","version control",{"text":727,"config":728},"DevSecOps",{"href":729,"dataGaName":730,"dataGaLocation":629},"/topics/devsecops/","devsecops",{"text":732,"config":733},"Cloud Native",{"href":734,"dataGaName":735,"dataGaLocation":629},"/topics/cloud-native/","cloud native",{"text":737,"config":738},"AI for Coding",{"href":739,"dataGaName":740,"dataGaLocation":629},"/topics/devops/ai-for-coding/","ai for coding",{"text":742,"config":743},"Agentic AI",{"href":744,"dataGaName":745,"dataGaLocation":629},"/topics/agentic-ai/","agentic ai",{"title":747,"links":748},"Solutions",[749,751,753,758,762,765,769,772,774,777,780,785],{"text":279,"config":750},{"href":274,"dataGaName":279,"dataGaLocation":629},{"text":268,"config":752},{"href":251,"dataGaName":252,"dataGaLocation":629},{"text":754,"config":755},"Agile development",{"href":756,"dataGaName":757,"dataGaLocation":629},"/solutions/agile-delivery/","agile delivery",{"text":759,"config":760},"SCM",{"href":264,"dataGaName":761,"dataGaLocation":629},"source code management",{"text":708,"config":763},{"href":257,"dataGaName":764,"dataGaLocation":629},"continuous integration & delivery",{"text":766,"config":767},"Value stream management",{"href":307,"dataGaName":768,"dataGaLocation":629},"value stream management",{"text":713,"config":770},{"href":771,"dataGaName":716,"dataGaLocation":629},"/solutions/gitops/",{"text":317,"config":773},{"href":320,"dataGaName":321,"dataGaLocation":629},{"text":775,"config":776},"Small business",{"href":326,"dataGaName":327,"dataGaLocation":629},{"text":778,"config":779},"Public sector",{"href":332,"dataGaName":333,"dataGaLocation":629},{"text":781,"config":782},"Education",{"href":783,"dataGaName":784,"dataGaLocation":629},"/solutions/education/","education",{"text":786,"config":787},"Financial services",{"href":788,"dataGaName":789,"dataGaLocation":629},"/solutions/finance/","financial services",{"title":340,"links":791},[792,794,796,798,801,803,806,808,810,812,814,816,818,820],{"text":353,"config":793},{"href":355,"dataGaName":356,"dataGaLocation":629},{"text":358,"config":795},{"href":360,"dataGaName":361,"dataGaLocation":629},{"text":363,"config":797},{"href":365,"dataGaName":366,"dataGaLocation":629},{"text":368,"config":799},{"href":370,"dataGaName":800,"dataGaLocation":629},"docs",{"text":391,"config":802},{"href":393,"dataGaName":394,"dataGaLocation":629},{"text":804,"config":805},"What's new",{"href":451,"dataGaName":452,"dataGaLocation":629},{"text":386,"config":807},{"href":388,"dataGaName":389,"dataGaLocation":629},{"text":405,"config":809},{"href":407,"dataGaName":408,"dataGaLocation":629},{"text":413,"config":811},{"href":415,"dataGaName":416,"dataGaLocation":629},{"text":418,"config":813},{"href":420,"dataGaName":421,"dataGaLocation":629},{"text":423,"config":815},{"href":425,"dataGaName":426,"dataGaLocation":629},{"text":428,"config":817},{"href":430,"dataGaName":431,"dataGaLocation":629},{"text":433,"config":819},{"href":435,"dataGaName":436,"dataGaLocation":629},{"text":438,"config":821},{"href":440,"dataGaName":441,"dataGaLocation":629},{"title":454,"links":823},[824,826,828,830,832,834,838,843,845,847,849],{"text":462,"config":825},{"href":464,"dataGaName":456,"dataGaLocation":629},{"text":467,"config":827},{"href":469,"dataGaName":470,"dataGaLocation":629},{"text":475,"config":829},{"href":477,"dataGaName":478,"dataGaLocation":629},{"text":480,"config":831},{"href":482,"dataGaName":483,"dataGaLocation":629},{"text":485,"config":833},{"href":487,"dataGaName":488,"dataGaLocation":629},{"text":835,"config":836},"Sustainability",{"href":837,"dataGaName":835,"dataGaLocation":629},"/sustainability/",{"text":839,"config":840},"Diversity, inclusion and belonging (DIB)",{"href":841,"dataGaName":842,"dataGaLocation":629},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":490,"config":844},{"href":492,"dataGaName":493,"dataGaLocation":629},{"text":500,"config":846},{"href":502,"dataGaName":503,"dataGaLocation":629},{"text":505,"config":848},{"href":507,"dataGaName":508,"dataGaLocation":629},{"text":850,"config":851},"Modern Slavery Transparency Statement",{"href":852,"dataGaName":853,"dataGaLocation":629},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":855},[856,859,862],{"text":857,"config":858},"Terms",{"href":681,"dataGaName":682,"dataGaLocation":629},{"text":860,"config":861},"Cookies",{"dataGaName":691,"dataGaLocation":629,"id":692,"isOneTrustButton":169},{"text":863,"config":864},"Privacy",{"href":686,"dataGaName":687,"dataGaLocation":629},[866],{"id":867,"title":868,"body":165,"config":869,"content":871,"description":165,"extension":874,"meta":875,"navigation":169,"path":876,"seo":877,"stem":878,"__hash__":879},"blogAuthors/en-us/blog/authors/gitlab.yml","Gitlab",{"template":870},"BlogAuthor",{"name":7,"config":872},{"headshot":873,"ctfId":7},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","yml",{},"/en-us/blog/authors/gitlab",{},"en-us/blog/authors/gitlab","XCBKIcPoCs6zi2oHG7o-bAp52Jhaw8_zGhIJ2jNrEjU",[881,890,898],{"title":882,"description":883,"heroImage":884,"category":161,"date":885,"authors":886,"slug":889,"externalUrl":165},"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",[887,888],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":891,"description":892,"heroImage":893,"category":161,"date":894,"authors":895,"slug":897,"externalUrl":165},"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",[896],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":899,"description":900,"heroImage":901,"category":161,"date":902,"authors":903,"slug":905,"externalUrl":165},"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",[904],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":907},[908,922,934,946],{"id":909,"categories":910,"header":912,"text":913,"button":914,"image":919},"ai-modernization",[911],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":915,"config":916},"Get your AI maturity score",{"href":917,"dataGaName":918,"dataGaLocation":394},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":920},{"src":921},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":923,"categories":924,"header":926,"text":913,"button":927,"image":931},"devops-modernization",[925,730],"product","Are you just managing tools or shipping innovation?",{"text":928,"config":929},"Get your DevOps maturity score",{"href":930,"dataGaName":918,"dataGaLocation":394},"/assessments/devops-modernization-assessment/",{"config":932},{"src":933},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":935,"categories":936,"header":938,"text":913,"button":939,"image":943},"security-modernization",[937],"security","Are you trading speed for security?",{"text":940,"config":941},"Get your security maturity score",{"href":942,"dataGaName":918,"dataGaLocation":394},"/assessments/security-modernization-assessment/",{"config":944},{"src":945},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":947,"paths":948,"header":951,"text":952,"button":953,"image":958},"github-azure-migration",[949,950],"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":954,"config":955},"See how GitLab compares to GitHub",{"href":956,"dataGaName":957,"dataGaLocation":394},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":959},{"src":933},{"header":961,"blurb":962,"button":963,"secondaryButton":968},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":964,"config":965},"Get your free trial",{"href":966,"dataGaName":193,"dataGaLocation":967},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":667,"config":969},{"href":519,"dataGaName":198,"dataGaLocation":967},1786803762114]