[{"data":1,"prerenderedAt":1475},["ShallowReactive",2],{"/blog/dotfiles-document-and-automate-your-macbook-setup":3,"navigation-en-us":691,"banner-en-us":1119,"footer-en-us":1129,"blog-post-authors-en-us-Michael Friedrich":1373,"blog-related-posts-en-us-dotfiles-document-and-automate-your-macbook-setup":1388,"blog-promotions-en-us":1411,"next-steps-en-us":1465},{"id":4,"title":5,"authors":6,"body":8,"category":671,"date":672,"description":673,"extension":674,"externalUrl":675,"faq":675,"featured":676,"heroImage":677,"meta":678,"navigation":177,"path":679,"seo":680,"slug":684,"stem":685,"tags":686,"template":689,"updatedDate":675,"__hash__":690},"blogPosts/en-us/blog/dotfiles-document-and-automate-your-macbook-setup.md","dotfiles - Document and automate your Macbook setup",[7],"Michael Friedrich",{"type":9,"value":10,"toc":658},"minimark",[11,16,20,23,39,43,46,49,52,55,58,62,70,80,85,88,98,141,145,156,275,278,282,288,356,360,363,370,379,386,395,398,421,425,433,448,455,459,462,522,525,595,606,627,635,639,646,654],[12,13,15],"h2",{"id":14},"what-are-dotfiles","What are dotfiles?",[17,18,19],"p",{},"What are dotfiles? Put simply, a dotfile is a file that starts with a dot (.), which differentiates it from other file types. Beyond that, a dotfile is a way for software developers to be more productive. Dotfiles are configuration files that help a variety of programs manage their functionality. Dotfiles are hidden by default in a Unix-based system.\nDotfiles can be used to set environment variables, define shell aliases, configure editors and other command-line tools, and much more. They are typically stored in the home directory of a user and are loaded when the user logs in, or when a new shell is opened.",[17,21,22],{},"Some examples of dotfiles you may have encountered before (or not) include:",[24,25,26,30,33,36],"ul",{},[27,28,29],"li",{},".vimrc",[27,31,32],{},".bash_profile or .bashrc * .config",[27,34,35],{},".gitconfig",[27,37,38],{},".zshrc",[12,40,42],{"id":41},"why-use-dotfiles","Why use dotfiles?",[17,44,45],{},"Why use dotfiles? When I first started working on Windows, Linux and macOS many years ago, there was this steep learning curve. Not everything on the system had a good default for improved productivity, often tools were missing to create your own work environment.",[17,47,48],{},"At first glance, I started writing blog posts and shared my findings with everyone. This had the benefit that I exactly knew where these snippets can be found. Many years ago, systems were not so reliable and often a full operating system reinstall worked better than troubleshooting existing problems.",[17,50,51],{},"After some years, many best practices had been documented in blog posts and were hard to apply in one go. Especially with working in many areas for development, professional services, ops and support, different settings and tools have been applied. At that point I had created a wiki page with text and screenshots.",[17,53,54],{},"The wiki page allowed for many revisions, and was kept in the internal Confluence since it contained company sensitive information. I often was asked how my Linux and macOS setup looks like and if I could share best practices.",[17,56,57],{},"Then I learned that users share their configuration and setup commands in a Git repository which is called “dotfiles”. At first glance, a dotfile is a hidden file on a Linux/Unix system, containing tool specific settings. Common tools are Git, vim, bash storing their configuration in a dotfile in the user’s home directory.\nThese dotfiles were enriched with scripts to install additional software via package managers, and to apply certain runtime configuration after the work environment was setup the first time.",[12,59,61],{"id":60},"dotfiles-on-my-macbook","dotfiles on my Macbook",[17,63,64,65,69],{},"My first steps with dotfiles started at the point where updating the Confluence wiki became troublesome. It also was the only left bastion where I could not write documentation in Markdown. Within the dotfiles Git repository, best practice always has been a ",[66,67,68],"code",{},"README.md"," file which describes more details and tips. Copying snippets and scripts for everyone also has become easier. Users can even fork the repository and use this as a basis for their own work environments.",[17,71,72,73,79],{},"Navigate into my ",[74,75,78],"a",{"href":76,"rel":77},"https://gitlab.com/dnsmichi/dotfiles",[],"dotfiles repository"," to learn more. The following sections highlight some of my daily best practices as a Developer Evangelist at GitLab.",[81,82,84],"h3",{"id":83},"zsh-with-ohmyzsh","ZSH with OhMyZSH",[17,86,87],{},"macOS Catalina uses ZSH by default. Therefore I was looking into best practices and soon learned about OhMyZSH as shell framework. It comes with nice plugins which provide a native Git shell integration as well as exporting credentials as environment variables.",[17,89,90,91,93,94,97],{},"In addition to the built-in functionality, it is easy to add custom aliases and settings. Avoid clutter inside the main ",[66,92,38],{}," file, instead extend ",[66,95,96],{},".oh-my-zsh/custom/aliases.zsh"," for example. The following alias allows to clean up the local git branches very easily:",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-sh shiki shiki-themes github-light","# Delete all remote tracking Git branches where the upstream branch has been deleted\nalias git_prune=\"git fetch --prune && git branch -vv | grep 'origin/.*: gone]' | awk '{print \\$1}' | xargs git branch -d\"\n","sh","",[66,106,107,116],{"__ignoreMap":104},[108,109,112],"span",{"class":110,"line":111},"line",1,[108,113,115],{"class":114},"sAwPA","# Delete all remote tracking Git branches where the upstream branch has been deleted\n",[108,117,119,123,127,130,134,138],{"class":110,"line":118},2,[108,120,122],{"class":121},"sD7c4","alias",[108,124,126],{"class":125},"sgsFI"," git_prune",[108,128,129],{"class":121},"=",[108,131,133],{"class":132},"sYBdl","\"git fetch --prune && git branch -vv | grep 'origin/.*: gone]' | awk '{print ",[108,135,137],{"class":136},"sYu0t","\\$",[108,139,140],{"class":132},"1}' | xargs git branch -d\"\n",[81,142,144],{"id":143},"git-configuration","Git configuration",[17,146,147,148,151,152,155],{},"My Git configuration is rather simple. The reason I keep it inside the dotfiles repository is that I always forget about the Git CLI commands to set them properly. Over the years, all my preferred customizations have been applied in Git itself. The only minimalistic addons are a custom ",[66,149,150],{},"git log"," command and the credential helper setting. I need that for storing the GitLab personal token and not being asked by ",[66,153,154],{},"git push/pull"," all the time.",[99,157,159],{"className":101,"code":158,"language":103,"meta":104,"style":104},"$ cat ~/.gitconfig\n\n[user]\n    name = Michael Friedrich\n    email = mfriedrich@gitlab.com\n        signingkey = D14A1F16\n[alias]\n        l  = log --graph --pretty=format:'%Cred%h%Creset %C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset' --abbrev-commit --date=relative --\n[credential]\n    helper = osxkeychain\n",[66,160,161,173,179,185,200,211,222,228,258,264],{"__ignoreMap":104},[108,162,163,167,170],{"class":110,"line":111},[108,164,166],{"class":165},"s7eDp","$",[108,168,169],{"class":132}," cat",[108,171,172],{"class":132}," ~/.gitconfig\n",[108,174,175],{"class":110,"line":118},[108,176,178],{"emptyLinePlaceholder":177},true,"\n",[108,180,182],{"class":110,"line":181},3,[108,183,184],{"class":125},"[user]\n",[108,186,188,191,194,197],{"class":110,"line":187},4,[108,189,190],{"class":165},"    name",[108,192,193],{"class":132}," =",[108,195,196],{"class":132}," Michael",[108,198,199],{"class":132}," Friedrich\n",[108,201,203,206,208],{"class":110,"line":202},5,[108,204,205],{"class":165},"    email",[108,207,193],{"class":132},[108,209,210],{"class":132}," mfriedrich@gitlab.com\n",[108,212,214,217,219],{"class":110,"line":213},6,[108,215,216],{"class":165},"        signingkey",[108,218,193],{"class":132},[108,220,221],{"class":132}," D14A1F16\n",[108,223,225],{"class":110,"line":224},7,[108,226,227],{"class":125},"[alias]\n",[108,229,231,234,237,240,243,246,249,252,255],{"class":110,"line":230},8,[108,232,233],{"class":165},"        l",[108,235,236],{"class":132},"  =",[108,238,239],{"class":132}," log",[108,241,242],{"class":136}," --graph",[108,244,245],{"class":136}," --pretty=format:",[108,247,248],{"class":132},"'%Cred%h%Creset %C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset'",[108,250,251],{"class":136}," --abbrev-commit",[108,253,254],{"class":136}," --date=relative",[108,256,257],{"class":136}," --\n",[108,259,261],{"class":110,"line":260},9,[108,262,263],{"class":125},"[credential]\n",[108,265,267,270,272],{"class":110,"line":266},10,[108,268,269],{"class":165},"    helper",[108,271,193],{"class":132},[108,273,274],{"class":132}," osxkeychain\n",[17,276,277],{},"The Git shell prompt integration is done with OhMyZSH as plugin. Previously I had done this with a customized Bash profile. I decided to go for ZSH with macOS Catalina and my new job at GitLab.",[81,279,281],{"id":280},"vim-configuration","vim configuration",[17,283,284,285,287],{},"Even with habits changed to using VS Code/Atom or the Web IDE, I am still very fast with vim, especially with spell checking included. I've been carrying this ",[66,286,29],{}," file around for more than 10 years now and it always helped :) Here is the best of - there is more inside with syntax highlighting and restoring the cursor on re-open.",[99,289,291],{"className":101,"code":290,"language":103,"meta":104,"style":104},"set viminfo='20,\u003C1000,s1000,:20,%,n~/.viminfo “ Increase buffer size for search\nset history=50            \" keep 50 lines of command line history\nset ruler                      \" show the cursor position all the time\nset nofixeol                 \" don't fix end-of-line errors\n\"set background=dark\nset background=light\nset showcmd              \" Show (partial) command in status line.\nset showmatch           \" Show matching brackets.\n",[66,292,293,301,306,311,325,330,335,346],{"__ignoreMap":104},[108,294,295,298],{"class":110,"line":111},[108,296,297],{"class":136},"set",[108,299,300],{"class":132}," viminfo='20,\u003C1000,s1000,:20,%,n~/.viminfo “ Increase buffer size for search\n",[108,302,303],{"class":110,"line":118},[108,304,305],{"class":132},"set history=50            \" keep 50 lines of command line history\n",[108,307,308],{"class":110,"line":181},[108,309,310],{"class":132},"set ruler                      \" show the cursor position all the time\n",[108,312,313,316,319,322],{"class":110,"line":187},[108,314,315],{"class":132},"set nofixeol                 \" don't",[108,317,318],{"class":132}," fix",[108,320,321],{"class":132}," end-of-line",[108,323,324],{"class":132}," errors\n",[108,326,327],{"class":110,"line":202},[108,328,329],{"class":165},"\"set background=dark\n",[108,331,332],{"class":110,"line":213},[108,333,334],{"class":165},"set background=light\n",[108,336,337,340,343],{"class":110,"line":224},[108,338,339],{"class":165},"set showcmd              \"",[108,341,342],{"class":132}," Show",[108,344,345],{"class":125}," (partial) command in status line.\n",[108,347,348,350,353],{"class":110,"line":230},[108,349,297],{"class":136},[108,351,352],{"class":132}," showmatch",[108,354,355],{"class":132},"           \" Show matching brackets.\n",[81,357,359],{"id":358},"install-favorite-software-and-tools","Install favorite software and tools",[17,361,362],{},"Homebrew is my favorite package manager on macOS. It ranges from adding simple tools like “htop” to applications not available in the app store like “Gimp”.",[17,364,365,366,369],{},"In order to keep things simple, the ",[66,367,368],{},"brew_once.sh"," script takes care of installing Homebrew, enabling the cask system for applications and installs wget/curl to setup OhMyZsh.",[99,371,373],{"className":101,"code":372,"language":103,"meta":104,"style":104},"./brew_once.sh\n",[66,374,375],{"__ignoreMap":104},[108,376,377],{"class":110,"line":111},[108,378,372],{"class":165},[17,380,381,382,385],{},"Additional software is installed with the “",[66,383,384],{},"brew.sh"," script. This can be re-run any time to ensure the same state is applied. This will be useful if an application was accidentally removed. Please fork the repository and adjust everything for your likings!",[99,387,389],{"className":101,"code":388,"language":103,"meta":104,"style":104},"./brew.sh\n",[66,390,391],{"__ignoreMap":104},[108,392,393],{"class":110,"line":111},[108,394,388],{"class":165},[17,396,397],{},"The script takes care of installing the following:",[24,399,400,403,406,409,412,415,418],{},[27,401,402],{},"GNU utils (sed, awk, tar, sha256sum). The macOS utils differ a bit and may break scripts made for Linux.",[27,404,405],{},"System tools (htop, pidof, pstree, grep, screen, nmap, ssh-copy-id, tree)",[27,407,408],{},"Images (imagemagick) for easy conversions",[27,410,411],{},"Archive and Git (git, git-lfs, p7zip, xz, tig, hub)",[27,413,414],{},"JSON (jq, jo)",[27,416,417],{},"Development (Ruby, Python, Go, Redis)",[27,419,420],{},"Applications as cask (Java, Atom, VS Code, Firefox, VLC, Gimp, Vagrant)",[81,422,424],{"id":423},"enhanced-workflows-with-alfred","Enhanced Workflows with Alfred",[17,426,427,432],{},[74,428,431],{"href":429,"rel":430},"https://www.alfredapp.com/",[],"Alfred"," is not only a Spotlight replacement for opening applications or searching files. The major selling points are custom workflows accessible by quick typing. Picking HTML color codes, querying DNS records or copying emojis all over the place have become easier with quick shortcuts.",[17,434,435,436,439,440,443,444,447],{},"Tired of locking your screen on macOS? ",[66,437,438],{},"Cmd+Space, l, Enter"," after Alfred has learned that ",[66,441,442],{},"l"," means ",[66,445,446],{},"lock",". Yep, it remembers the most often typed commands.",[17,449,450],{},[451,452],"img",{"alt":453,"src":454},"Alfred Workflow Dig GitLab.com IPv6","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397934/blog/Content%20Images/alfred_workflow_dig_gitlab.com_aaaa.png",[12,456,458],{"id":457},"trackpad-and-keyboard","Trackpad and keyboard",[17,460,461],{},"I always used to have a mouse with me for my previous notebooks, and the change to the trackpad always worried me. Move the mouse, click here and on it goes. When I got my first iPad, I got introduced to just tapping and approving.\nI’ve learned that this setting can be enabled on macOS too for the trackpad which is my preferred input method since then. In order to automate this setting, run the following CLI commands:",[99,463,465],{"className":101,"code":464,"language":103,"meta":104,"style":104},"defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true\ndefaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1\ndefaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1\n",[66,466,467,487,508],{"__ignoreMap":104},[108,468,469,472,475,478,481,484],{"class":110,"line":111},[108,470,471],{"class":165},"defaults",[108,473,474],{"class":132}," write",[108,476,477],{"class":132}," com.apple.driver.AppleBluetoothMultitouch.trackpad",[108,479,480],{"class":132}," Clicking",[108,482,483],{"class":136}," -bool",[108,485,486],{"class":136}," true\n",[108,488,489,491,494,496,499,502,505],{"class":110,"line":118},[108,490,471],{"class":165},[108,492,493],{"class":136}," -currentHost",[108,495,474],{"class":132},[108,497,498],{"class":132}," NSGlobalDomain",[108,500,501],{"class":132}," com.apple.mouse.tapBehavior",[108,503,504],{"class":136}," -int",[108,506,507],{"class":136}," 1\n",[108,509,510,512,514,516,518,520],{"class":110,"line":181},[108,511,471],{"class":165},[108,513,474],{"class":132},[108,515,498],{"class":132},[108,517,501],{"class":132},[108,519,504],{"class":136},[108,521,507],{"class":136},[17,523,524],{},"Another thing I prefer using - the right click for accessing the actions toolbar. By default, the secondary click is available with two fingers. My improved workflow prefers the right bottom corner of the trackpad. You can either change this inside the trackpad preferences or run these CLI commands:",[99,526,528],{"className":101,"code":527,"language":103,"meta":104,"style":104},"defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadCornerSecondaryClick -int 2\ndefaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadRightClick -bool true\ndefaults -currentHost write NSGlobalDomain com.apple.trackpad.trackpadCornerClickBehavior -int 1\ndefaults -currentHost write NSGlobalDomain com.apple.trackpad.enableSecondaryClick -bool true\n",[66,529,530,546,561,578],{"__ignoreMap":104},[108,531,532,534,536,538,541,543],{"class":110,"line":111},[108,533,471],{"class":165},[108,535,474],{"class":132},[108,537,477],{"class":132},[108,539,540],{"class":132}," TrackpadCornerSecondaryClick",[108,542,504],{"class":136},[108,544,545],{"class":136}," 2\n",[108,547,548,550,552,554,557,559],{"class":110,"line":118},[108,549,471],{"class":165},[108,551,474],{"class":132},[108,553,477],{"class":132},[108,555,556],{"class":132}," TrackpadRightClick",[108,558,483],{"class":136},[108,560,486],{"class":136},[108,562,563,565,567,569,571,574,576],{"class":110,"line":181},[108,564,471],{"class":165},[108,566,493],{"class":136},[108,568,474],{"class":132},[108,570,498],{"class":132},[108,572,573],{"class":132}," com.apple.trackpad.trackpadCornerClickBehavior",[108,575,504],{"class":136},[108,577,507],{"class":136},[108,579,580,582,584,586,588,591,593],{"class":110,"line":187},[108,581,471],{"class":165},[108,583,493],{"class":136},[108,585,474],{"class":132},[108,587,498],{"class":132},[108,589,590],{"class":132}," com.apple.trackpad.enableSecondaryClick",[108,592,483],{"class":136},[108,594,486],{"class":136},[17,596,597,598,601,602,605],{},"Last but not least using ",[66,599,600],{},"tab"," for changing the focus area in windows is a must have. This is hidden in the keyboard shortcut settings as ",[66,603,604],{},"use keyboard navigation to move focus between controls",".",[99,607,609],{"className":101,"code":608,"language":103,"meta":104,"style":104},"defaults write NSGlobalDomain AppleKeyboardUIMode -int 3\n",[66,610,611],{"__ignoreMap":104},[108,612,613,615,617,619,622,624],{"class":110,"line":111},[108,614,471],{"class":165},[108,616,474],{"class":132},[108,618,498],{"class":132},[108,620,621],{"class":132}," AppleKeyboardUIMode",[108,623,504],{"class":136},[108,625,626],{"class":136}," 3\n",[17,628,629,630,605],{},"Additional ideas and commands can be found in ",[74,631,634],{"href":632,"rel":633},"https://github.com/herrbischoff/awesome-macos-command-line",[],"this repository",[12,636,638],{"id":637},"documentation","Documentation",[17,640,641,642,645],{},"Everything else is stored in the GitLab repository, including the documentation in Markdown format. Additional screenshots can be put there too into the ",[66,643,644],{},"doc/images"," directory for example.\nThere is no need to carry an extra wiki page around and everyone can access the repository via URL. You can also download the whole archive and work offline.",[17,647,648,649,653],{},"The best thing about my dotfiles repository - it is open source and we can learn, share, suggest together :-)\nDo you have a cool idea for making this even more convenient? Fork the ",[74,650,652],{"href":76,"rel":651},[],"repository"," and send a merge request please!",[655,656,657],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":104,"searchDepth":118,"depth":118,"links":659},[660,661,662,669,670],{"id":14,"depth":118,"text":15},{"id":41,"depth":118,"text":42},{"id":60,"depth":118,"text":61,"children":663},[664,665,666,667,668],{"id":83,"depth":181,"text":84},{"id":143,"depth":181,"text":144},{"id":280,"depth":181,"text":281},{"id":358,"depth":181,"text":359},{"id":423,"depth":181,"text":424},{"id":457,"depth":118,"text":458},{"id":637,"depth":118,"text":638},"unfiltered","2020-04-17","Document and automate your Macbook setup with installing tools and well-known configuration settings. Follow best practices from a developer’s point of view.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664102/Blog/Hero%20Images/gitlab-values-cover.png",{},"/en-us/blog/dotfiles-document-and-automate-your-macbook-setup",{"title":5,"description":673,"ogTitle":5,"ogDescription":673,"noIndex":676,"ogImage":677,"ogUrl":681,"ogSiteName":682,"ogType":683,"canonicalUrls":681},"https://about.gitlab.com/blog/dotfiles-document-and-automate-your-macbook-setup","https://about.gitlab.com","article","dotfiles-document-and-automate-your-macbook-setup","en-us/blog/dotfiles-document-and-automate-your-macbook-setup",[687,687,688,688],"cloud native","agile","BlogPost","_5DwwXix-9r4i17Q7QqXZsnCOeaiIycNs4k-6MuJ5_c",{"logo":692,"freeTrial":697,"sales":702,"login":707,"items":712,"search":1039,"minimal":1070,"duo":1089,"switchNav":1098,"pricingDeployment":1109},{"config":693},{"href":694,"dataGaName":695,"dataGaLocation":696},"/","gitlab logo","header",{"text":698,"config":699},"Get free trial",{"href":700,"dataGaName":701,"dataGaLocation":696},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":703,"config":704},"Request a demo",{"href":705,"dataGaName":706,"dataGaLocation":696},"/sales/?contact-topic=request-demo","sales",{"text":708,"config":709},"Sign in",{"href":710,"dataGaName":711,"dataGaLocation":696},"https://gitlab.com/users/sign_in/","sign in",[713,742,842,847,961,1017],{"text":714,"config":715,"menu":717},"Platform",{"dataNavLevelOne":716},"platform",{"type":718,"columns":719},"cards",[720,726,734],{"title":714,"description":721,"link":722},"The intelligent orchestration platform for DevSecOps",{"text":723,"config":724},"Explore our Platform",{"href":725,"dataGaName":716,"dataGaLocation":696},"/platform/",{"title":727,"description":728,"link":729},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":730,"config":731},"Meet GitLab Duo",{"href":732,"dataGaName":733,"dataGaLocation":696},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":735,"description":736,"link":737},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":738,"config":739},"Learn more",{"href":740,"dataGaName":741,"dataGaLocation":696},"/why-gitlab/","why gitlab",{"text":743,"left":177,"config":744,"menu":746},"Product",{"dataNavLevelOne":745},"solutions",{"type":747,"link":748,"columns":752,"feature":821},"lists",{"text":749,"config":750},"View all Solutions",{"href":751,"dataGaName":745,"dataGaLocation":696},"/solutions/",[753,777,800],{"title":754,"description":755,"link":756,"items":761},"Automation","CI/CD and automation to accelerate deployment",{"config":757},{"icon":758,"href":759,"dataGaName":760,"dataGaLocation":696},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[762,766,769,773],{"text":763,"config":764},"CI/CD",{"href":765,"dataGaLocation":696,"dataGaName":763},"/solutions/continuous-integration/",{"text":727,"config":767},{"href":732,"dataGaLocation":696,"dataGaName":768},"gitlab duo agent platform - product menu",{"text":770,"config":771},"Source Code Management",{"href":772,"dataGaLocation":696,"dataGaName":770},"/solutions/source-code-management/",{"text":774,"config":775},"Automated Software Delivery",{"href":759,"dataGaLocation":696,"dataGaName":776},"Automated software delivery",{"title":778,"description":779,"link":780,"items":785},"Security","Deliver code faster without compromising security",{"config":781},{"href":782,"dataGaName":783,"dataGaLocation":696,"icon":784},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[786,790,795],{"text":787,"config":788},"Application Security Testing",{"href":782,"dataGaName":789,"dataGaLocation":696},"Application security testing",{"text":791,"config":792},"Software Supply Chain Security",{"href":793,"dataGaLocation":696,"dataGaName":794},"/solutions/supply-chain/","Software supply chain security",{"text":796,"config":797},"Software Compliance",{"href":798,"dataGaName":799,"dataGaLocation":696},"/solutions/software-compliance/","software compliance",{"title":801,"link":802,"items":807},"Measurement",{"config":803},{"icon":804,"href":805,"dataGaName":806,"dataGaLocation":696},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[808,812,816],{"text":809,"config":810},"Visibility & Measurement",{"href":805,"dataGaLocation":696,"dataGaName":811},"Visibility and Measurement",{"text":813,"config":814},"Value Stream Management",{"href":815,"dataGaLocation":696,"dataGaName":813},"/solutions/value-stream-management/",{"text":817,"config":818},"Analytics & Insights",{"href":819,"dataGaLocation":696,"dataGaName":820},"/solutions/analytics-and-insights/","Analytics and insights",{"title":822,"type":747,"items":823},"GitLab for",[824,830,836],{"text":825,"config":826},"Enterprise",{"icon":827,"href":828,"dataGaLocation":696,"dataGaName":829},"Building","/enterprise/","enterprise",{"text":831,"config":832},"Small Business",{"icon":833,"href":834,"dataGaLocation":696,"dataGaName":835},"Work","/small-business/","small business",{"text":837,"config":838},"Public Sector",{"icon":839,"href":840,"dataGaLocation":696,"dataGaName":841},"Organization","/solutions/public-sector/","public sector",{"text":843,"config":844},"Pricing",{"href":845,"dataGaName":846,"dataGaLocation":696,"dataNavLevelOne":846},"/pricing/","pricing",{"text":848,"config":849,"menu":851},"Resources",{"dataNavLevelOne":850},"resources",{"type":747,"link":852,"columns":856,"feature":950},{"text":853,"config":854},"View all resources",{"href":855,"dataGaName":850,"dataGaLocation":696},"/resources/",[857,890,917],{"title":858,"items":859},"Getting started",[860,865,870,875,880,885],{"text":861,"config":862},"Install",{"href":863,"dataGaName":864,"dataGaLocation":696},"/install/","install",{"text":866,"config":867},"Quick start guides",{"href":868,"dataGaName":869,"dataGaLocation":696},"/get-started/","quick setup checklists",{"text":871,"config":872},"Learn",{"href":873,"dataGaLocation":696,"dataGaName":874},"https://university.gitlab.com/","learn",{"text":876,"config":877},"Product documentation",{"href":878,"dataGaName":879,"dataGaLocation":696},"https://docs.gitlab.com/","product documentation",{"text":881,"config":882},"Best practice videos",{"href":883,"dataGaName":884,"dataGaLocation":696},"/getting-started-videos/","best practice videos",{"text":886,"config":887},"Integrations",{"href":888,"dataGaName":889,"dataGaLocation":696},"/integrations/","integrations",{"title":891,"items":892},"Discover",[893,898,903,908,912],{"text":894,"config":895},"Customer success stories",{"href":896,"dataGaName":897,"dataGaLocation":696},"/customers/","customer success stories",{"text":899,"config":900},"Blog",{"href":901,"dataGaName":902,"dataGaLocation":696},"/blog/","blog",{"text":904,"config":905},"Demo Hub",{"href":906,"dataGaName":907,"dataGaLocation":696},"/demo-hub/","demo hub",{"text":909,"config":910},"The Source",{"href":911,"dataGaName":902,"dataGaLocation":696},"/the-source/",{"text":913,"config":914},"Remote",{"href":915,"dataGaName":916,"dataGaLocation":696},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":918,"items":919},"Connect",[920,925,930,935,940,945],{"text":921,"config":922},"GitLab Services",{"href":923,"dataGaName":924,"dataGaLocation":696},"/services/","services",{"text":926,"config":927},"Contribute",{"href":928,"dataGaName":929,"dataGaLocation":696},"https://contributors.gitlab.com","contribute",{"text":931,"config":932},"Community",{"href":933,"dataGaName":934,"dataGaLocation":696},"/community/","community",{"text":936,"config":937},"Forum",{"href":938,"dataGaName":939,"dataGaLocation":696},"https://forum.gitlab.com/","forum",{"text":941,"config":942},"Events",{"href":943,"dataGaName":944,"dataGaLocation":696},"/events/","events",{"text":946,"config":947},"Partners",{"href":948,"dataGaName":949,"dataGaLocation":696},"/partners/","partners",{"config":951,"title":954,"text":955,"link":956},{"background":952,"textColor":953},"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":957,"config":958},"Read the latest",{"href":959,"dataGaName":960,"dataGaLocation":696},"/whats-new/","whats new",{"text":962,"config":963,"menu":965},"Company",{"dataNavLevelOne":964},"company",{"type":747,"columns":966},[967],{"items":968},[969,974,980,982,987,992,997,1002,1007,1012],{"text":970,"config":971},"About",{"href":972,"dataGaName":973,"dataGaLocation":696},"/company/","about",{"text":975,"config":976,"footerGa":979},"Jobs",{"href":977,"dataGaName":978,"dataGaLocation":696},"/jobs/","jobs",{"dataGaName":978},{"text":941,"config":981},{"href":943,"dataGaName":944,"dataGaLocation":696},{"text":983,"config":984},"Leadership",{"href":985,"dataGaName":986,"dataGaLocation":696},"/company/team/e-group/","leadership",{"text":988,"config":989},"Handbook",{"href":990,"dataGaName":991,"dataGaLocation":696},"https://handbook.gitlab.com/","handbook",{"text":993,"config":994},"Investor relations",{"href":995,"dataGaName":996,"dataGaLocation":696},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":998,"config":999},"Trust Center",{"href":1000,"dataGaName":1001,"dataGaLocation":696},"/security/","trust center",{"text":1003,"config":1004},"AI Transparency Center",{"href":1005,"dataGaName":1006,"dataGaLocation":696},"/ai-transparency-center/","ai transparency center",{"text":1008,"config":1009},"Newsletter",{"href":1010,"dataGaName":1011,"dataGaLocation":696},"/company/contact/#contact-forms","newsletter",{"text":1013,"config":1014},"Press",{"href":1015,"dataGaName":1016,"dataGaLocation":696},"/press/","press",{"text":1018,"config":1019,"menu":1020},"Contact us",{"dataNavLevelOne":964},{"type":747,"columns":1021},[1022],{"items":1023},[1024,1029,1034],{"text":1025,"config":1026},"Talk to sales",{"href":1027,"dataGaName":1028,"dataGaLocation":696},"/sales/","talk to sales",{"text":1030,"config":1031},"Support portal",{"href":1032,"dataGaName":1033,"dataGaLocation":696},"https://support.gitlab.com/hc/en-us","support portal",{"text":1035,"config":1036},"Customer portal",{"href":1037,"dataGaName":1038,"dataGaLocation":696},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1040,"login":1041,"suggestions":1048},"Close",{"text":1042,"link":1043},"To search repositories and projects, login to",{"text":1044,"config":1045},"gitlab.com",{"href":710,"dataGaName":1046,"dataGaLocation":1047},"search login","search",{"text":1049,"default":1050},"Suggestions",[1051,1053,1057,1059,1063,1067],{"text":727,"config":1052},{"href":732,"dataGaName":727,"dataGaLocation":1047},{"text":1054,"config":1055},"Code Suggestions (AI)",{"href":1056,"dataGaName":1054,"dataGaLocation":1047},"/solutions/code-suggestions/",{"text":763,"config":1058},{"href":765,"dataGaName":763,"dataGaLocation":1047},{"text":1060,"config":1061},"GitLab on AWS",{"href":1062,"dataGaName":1060,"dataGaLocation":1047},"/partners/technology-partners/aws/",{"text":1064,"config":1065},"GitLab on Google Cloud",{"href":1066,"dataGaName":1064,"dataGaLocation":1047},"/partners/technology-partners/google-cloud-platform/",{"text":1068,"config":1069},"Why GitLab?",{"href":740,"dataGaName":1068,"dataGaLocation":1047},{"freeTrial":1071,"mobileIcon":1076,"desktopIcon":1081,"secondaryButton":1084},{"text":1072,"config":1073},"Start free trial",{"href":1074,"dataGaName":701,"dataGaLocation":1075},"https://gitlab.com/-/trials/new/","nav",{"altText":1077,"config":1078},"Gitlab Icon",{"src":1079,"dataGaName":1080,"dataGaLocation":1075},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1077,"config":1082},{"src":1083,"dataGaName":1080,"dataGaLocation":1075},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1085,"config":1086},"Get Started",{"href":1087,"dataGaName":1088,"dataGaLocation":1075},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1090,"mobileIcon":1094,"desktopIcon":1096},{"text":1091,"config":1092},"Learn more about GitLab Duo",{"href":732,"dataGaName":1093,"dataGaLocation":1075},"gitlab duo",{"altText":1077,"config":1095},{"src":1079,"dataGaName":1080,"dataGaLocation":1075},{"altText":1077,"config":1097},{"src":1083,"dataGaName":1080,"dataGaLocation":1075},{"button":1099,"mobileIcon":1104,"desktopIcon":1106},{"text":1100,"config":1101},"/switch",{"href":1102,"dataGaName":1103,"dataGaLocation":1075},"#contact","switch",{"altText":1077,"config":1105},{"src":1079,"dataGaName":1080,"dataGaLocation":1075},{"altText":1077,"config":1107},{"src":1108,"dataGaName":1080,"dataGaLocation":1075},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1110,"mobileIcon":1115,"desktopIcon":1117},{"text":1111,"config":1112},"Back to pricing",{"href":845,"dataGaName":1113,"dataGaLocation":1075,"icon":1114},"back to pricing","GoBack",{"altText":1077,"config":1116},{"src":1079,"dataGaName":1080,"dataGaLocation":1075},{"altText":1077,"config":1118},{"src":1083,"dataGaName":1080,"dataGaLocation":1075},{"title":1120,"titleMobile":1121,"button":1122,"config":1127},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":738,"config":1123},{"href":1124,"dataGaName":1125,"dataGaLocation":1126},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1128,"disabled":676},"release",{"data":1130},{"text":1131,"source":1132,"edit":1138,"contribute":1143,"config":1148,"items":1153,"minimal":1362},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1133,"config":1134},"View page source",{"href":1135,"dataGaName":1136,"dataGaLocation":1137},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1139,"config":1140},"Edit this page",{"href":1141,"dataGaName":1142,"dataGaLocation":1137},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1144,"config":1145},"Please contribute",{"href":1146,"dataGaName":1147,"dataGaLocation":1137},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1149,"facebook":1150,"youtube":1151,"linkedin":1152},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1154,1201,1254,1298,1330],{"title":843,"links":1155,"subMenu":1170},[1156,1160,1165],{"text":1157,"config":1158},"View plans",{"href":845,"dataGaName":1159,"dataGaLocation":1137},"view plans",{"text":1161,"config":1162},"Why Premium?",{"href":1163,"dataGaName":1164,"dataGaLocation":1137},"/pricing/premium/","why premium",{"text":1166,"config":1167},"Why Ultimate?",{"href":1168,"dataGaName":1169,"dataGaLocation":1137},"/pricing/ultimate/","why ultimate",[1171],{"title":1172,"links":1173},"Contact Us",[1174,1177,1179,1181,1186,1191,1196],{"text":1175,"config":1176},"Contact sales",{"href":1027,"dataGaName":706,"dataGaLocation":1137},{"text":1030,"config":1178},{"href":1032,"dataGaName":1033,"dataGaLocation":1137},{"text":1035,"config":1180},{"href":1037,"dataGaName":1038,"dataGaLocation":1137},{"text":1182,"config":1183},"Status",{"href":1184,"dataGaName":1185,"dataGaLocation":1137},"https://status.gitlab.com/","status",{"text":1187,"config":1188},"Terms of use",{"href":1189,"dataGaName":1190,"dataGaLocation":1137},"/terms/","terms of use",{"text":1192,"config":1193},"Privacy statement",{"href":1194,"dataGaName":1195,"dataGaLocation":1137},"/privacy/","privacy statement",{"text":1197,"config":1198},"Cookie preferences",{"dataGaName":1199,"dataGaLocation":1137,"id":1200,"isOneTrustButton":177},"cookie preferences","ot-sdk-btn",{"title":743,"links":1202,"subMenu":1211},[1203,1207],{"text":1204,"config":1205},"DevSecOps platform",{"href":725,"dataGaName":1206,"dataGaLocation":1137},"devsecops platform",{"text":1208,"config":1209},"AI-Assisted Development",{"href":732,"dataGaName":1210,"dataGaLocation":1137},"ai-assisted development",[1212],{"title":1213,"links":1214},"Topics",[1215,1220,1225,1230,1235,1240,1244,1249],{"text":1216,"config":1217},"CICD",{"href":1218,"dataGaName":1219,"dataGaLocation":1137},"/topics/ci-cd/","cicd",{"text":1221,"config":1222},"GitOps",{"href":1223,"dataGaName":1224,"dataGaLocation":1137},"/topics/gitops/","gitops",{"text":1226,"config":1227},"DevOps",{"href":1228,"dataGaName":1229,"dataGaLocation":1137},"/topics/devops/","devops",{"text":1231,"config":1232},"Version Control",{"href":1233,"dataGaName":1234,"dataGaLocation":1137},"/topics/version-control/","version control",{"text":1236,"config":1237},"DevSecOps",{"href":1238,"dataGaName":1239,"dataGaLocation":1137},"/topics/devsecops/","devsecops",{"text":1241,"config":1242},"Cloud Native",{"href":1243,"dataGaName":687,"dataGaLocation":1137},"/topics/cloud-native/",{"text":1245,"config":1246},"AI for Coding",{"href":1247,"dataGaName":1248,"dataGaLocation":1137},"/topics/devops/ai-for-coding/","ai for coding",{"text":1250,"config":1251},"Agentic AI",{"href":1252,"dataGaName":1253,"dataGaLocation":1137},"/topics/agentic-ai/","agentic ai",{"title":1255,"links":1256},"Solutions",[1257,1259,1261,1266,1270,1273,1277,1280,1282,1285,1288,1293],{"text":787,"config":1258},{"href":782,"dataGaName":787,"dataGaLocation":1137},{"text":776,"config":1260},{"href":759,"dataGaName":760,"dataGaLocation":1137},{"text":1262,"config":1263},"Agile development",{"href":1264,"dataGaName":1265,"dataGaLocation":1137},"/solutions/agile-delivery/","agile delivery",{"text":1267,"config":1268},"SCM",{"href":772,"dataGaName":1269,"dataGaLocation":1137},"source code management",{"text":1216,"config":1271},{"href":765,"dataGaName":1272,"dataGaLocation":1137},"continuous integration & delivery",{"text":1274,"config":1275},"Value stream management",{"href":815,"dataGaName":1276,"dataGaLocation":1137},"value stream management",{"text":1221,"config":1278},{"href":1279,"dataGaName":1224,"dataGaLocation":1137},"/solutions/gitops/",{"text":825,"config":1281},{"href":828,"dataGaName":829,"dataGaLocation":1137},{"text":1283,"config":1284},"Small business",{"href":834,"dataGaName":835,"dataGaLocation":1137},{"text":1286,"config":1287},"Public sector",{"href":840,"dataGaName":841,"dataGaLocation":1137},{"text":1289,"config":1290},"Education",{"href":1291,"dataGaName":1292,"dataGaLocation":1137},"/solutions/education/","education",{"text":1294,"config":1295},"Financial services",{"href":1296,"dataGaName":1297,"dataGaLocation":1137},"/solutions/finance/","financial services",{"title":848,"links":1299},[1300,1302,1304,1306,1309,1311,1314,1316,1318,1320,1322,1324,1326,1328],{"text":861,"config":1301},{"href":863,"dataGaName":864,"dataGaLocation":1137},{"text":866,"config":1303},{"href":868,"dataGaName":869,"dataGaLocation":1137},{"text":871,"config":1305},{"href":873,"dataGaName":874,"dataGaLocation":1137},{"text":876,"config":1307},{"href":878,"dataGaName":1308,"dataGaLocation":1137},"docs",{"text":899,"config":1310},{"href":901,"dataGaName":902,"dataGaLocation":1137},{"text":1312,"config":1313},"What's new",{"href":959,"dataGaName":960,"dataGaLocation":1137},{"text":894,"config":1315},{"href":896,"dataGaName":897,"dataGaLocation":1137},{"text":913,"config":1317},{"href":915,"dataGaName":916,"dataGaLocation":1137},{"text":921,"config":1319},{"href":923,"dataGaName":924,"dataGaLocation":1137},{"text":926,"config":1321},{"href":928,"dataGaName":929,"dataGaLocation":1137},{"text":931,"config":1323},{"href":933,"dataGaName":934,"dataGaLocation":1137},{"text":936,"config":1325},{"href":938,"dataGaName":939,"dataGaLocation":1137},{"text":941,"config":1327},{"href":943,"dataGaName":944,"dataGaLocation":1137},{"text":946,"config":1329},{"href":948,"dataGaName":949,"dataGaLocation":1137},{"title":962,"links":1331},[1332,1334,1336,1338,1340,1342,1346,1351,1353,1355,1357],{"text":970,"config":1333},{"href":972,"dataGaName":964,"dataGaLocation":1137},{"text":975,"config":1335},{"href":977,"dataGaName":978,"dataGaLocation":1137},{"text":983,"config":1337},{"href":985,"dataGaName":986,"dataGaLocation":1137},{"text":988,"config":1339},{"href":990,"dataGaName":991,"dataGaLocation":1137},{"text":993,"config":1341},{"href":995,"dataGaName":996,"dataGaLocation":1137},{"text":1343,"config":1344},"Sustainability",{"href":1345,"dataGaName":1343,"dataGaLocation":1137},"/sustainability/",{"text":1347,"config":1348},"Diversity, inclusion and belonging (DIB)",{"href":1349,"dataGaName":1350,"dataGaLocation":1137},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":998,"config":1352},{"href":1000,"dataGaName":1001,"dataGaLocation":1137},{"text":1008,"config":1354},{"href":1010,"dataGaName":1011,"dataGaLocation":1137},{"text":1013,"config":1356},{"href":1015,"dataGaName":1016,"dataGaLocation":1137},{"text":1358,"config":1359},"Modern Slavery Transparency Statement",{"href":1360,"dataGaName":1361,"dataGaLocation":1137},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1363},[1364,1367,1370],{"text":1365,"config":1366},"Terms",{"href":1189,"dataGaName":1190,"dataGaLocation":1137},{"text":1368,"config":1369},"Cookies",{"dataGaName":1199,"dataGaLocation":1137,"id":1200,"isOneTrustButton":177},{"text":1371,"config":1372},"Privacy",{"href":1194,"dataGaName":1195,"dataGaLocation":1137},[1374],{"id":1375,"title":7,"body":675,"config":1376,"content":1378,"description":675,"extension":1382,"meta":1383,"navigation":177,"path":1384,"seo":1385,"stem":1386,"__hash__":1387},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":1377},"BlogAuthor",{"name":7,"config":1379},{"headshot":1380,"ctfId":1381},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi","yml",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[1389,1396,1404],{"title":1390,"description":1391,"heroImage":677,"category":671,"date":1392,"authors":1393,"slug":1395,"externalUrl":675},"CEO Shadow Takeaways from Jacie","Recap of my experience in the CEO Shadow Program.","2021-05-18",[1394],"Jacie Bandur","ceo-shadow-recap",{"title":1397,"description":1398,"heroImage":1399,"category":671,"date":1400,"authors":1401,"slug":1403,"externalUrl":675},"Why I love contributing to GitLab","Making small meaningful changes is what it's all about.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679501/Blog/Hero%20Images/new-feature.png","2021-05-11",[1402],"Austin Regnery","why-i-love-contributing-to-gitlab",{"title":1405,"description":1406,"heroImage":1407,"category":671,"date":1400,"authors":1408,"slug":1410,"externalUrl":675},"Placebo Lines on the Pipeline Graph","Have you noticed the connecting lines missing on your pipelines lately? Here's why","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679507/Blog/Hero%20Images/ci-cd.png",[1409],"Sam Beckham","placebo-lines-on-the-pipeline-graph",{"promotions":1412},[1413,1427,1439,1451],{"id":1414,"categories":1415,"header":1417,"text":1418,"button":1419,"image":1424},"ai-modernization",[1416],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1420,"config":1421},"Get your AI maturity score",{"href":1422,"dataGaName":1423,"dataGaLocation":902},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1425},{"src":1426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1428,"categories":1429,"header":1431,"text":1418,"button":1432,"image":1436},"devops-modernization",[1430,1239],"product","Are you just managing tools or shipping innovation?",{"text":1433,"config":1434},"Get your DevOps maturity score",{"href":1435,"dataGaName":1423,"dataGaLocation":902},"/assessments/devops-modernization-assessment/",{"config":1437},{"src":1438},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1440,"categories":1441,"header":1443,"text":1418,"button":1444,"image":1448},"security-modernization",[1442],"security","Are you trading speed for security?",{"text":1445,"config":1446},"Get your security maturity score",{"href":1447,"dataGaName":1423,"dataGaLocation":902},"/assessments/security-modernization-assessment/",{"config":1449},{"src":1450},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1452,"paths":1453,"header":1456,"text":1457,"button":1458,"image":1463},"github-azure-migration",[1454,1455],"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":1459,"config":1460},"See how GitLab compares to GitHub",{"href":1461,"dataGaName":1462,"dataGaLocation":902},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1464},{"src":1438},{"header":1466,"blurb":1467,"button":1468,"secondaryButton":1473},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1469,"config":1470},"Get your free trial",{"href":1471,"dataGaName":701,"dataGaLocation":1472},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1175,"config":1474},{"href":1027,"dataGaName":706,"dataGaLocation":1472},1786803749048]