[{"data":1,"prerenderedAt":1485},["ShallowReactive",2],{"/blog/simple-trick-for-smaller-screenshots":3,"navigation-en-us":701,"banner-en-us":1128,"footer-en-us":1138,"blog-post-authors-en-us-James Ramsay":1383,"blog-related-posts-en-us-simple-trick-for-smaller-screenshots":1397,"blog-promotions-en-us":1421,"next-steps-en-us":1475},{"id":4,"title":5,"authors":6,"body":8,"category":682,"date":683,"description":684,"extension":685,"externalUrl":686,"faq":686,"featured":687,"heroImage":688,"meta":689,"navigation":104,"path":690,"seo":691,"slug":695,"stem":696,"tags":697,"template":699,"updatedDate":686,"__hash__":700},"blogPosts/en-us/blog/simple-trick-for-smaller-screenshots.md","One simple trick to make your screenshots 80% smaller",[7],"James Ramsay",{"type":9,"value":10,"toc":676},"minimark",[11,19,22,25,38,48,51,56,65,80,190,193,258,261,265,274,290,345,348,354,358,373,376,451,458,504,523,597,607,610,642,645,648,652,655,658,672],[12,13,14,18],"p",{},[15,16,17],"strong",{},"Updated 2020-02-03:"," Added macOS Automator instructions.",[12,20,21],{},"I take screenshots every day to share with others in issues, blog posts, email, and Slack.\nI like them to be crisp, high resolution, and importantly the image file size should be as small as possible. Keeping the file size small means they are both fast to upload and to download. This is particularly important when I am writing a blog post or documentation.",[12,23,24],{},"Below is a quick primer on PNG compression, and instructions for completely automating the process.",[26,27,30,31],"figure",{"className":28},[29],"video_container","\n  ",[32,33,37],"iframe",{"src":34,"frameBorder":35,"allowFullScreen":36},"https://www.youtube-nocookie.com/embed/_E1f0xXDU3g","0","true"," ",[12,39,40,41,47],{},"When you capture a screenshot on your Mac, the image will be saved in the\nPNG-32 format, with support for 16 million distinct colors and transparency. This means that the screenshot will perfectly capture every pixel on your screen, but having four 8-bit channels for red, green, blue and alpha (transparency) for every pixel makes the file very large. If you're interested, you can verify this yourself using ",[42,43,46],"a",{"href":44,"rel":45},"http://www.libpng.org/pub/png/apps/pngcheck.html",[],"pngcheck",".",[12,49,50],{},"In practice, the subjects of my screenshots are buttons and forms, not photographs.  While you might want 16 million colors for photos, we don't need them for screenshots, so we can take advantage of the PNG-8 format with its more compact 256 color palette.",[52,53,55],"h2",{"id":54},"lossy-compression-color-quantization","Lossy Compression: Color Quantization",[12,57,58,59,64],{},"The first step is to reduce the color palette of the screenshot. This is a type of lossy compression called ",[42,60,63],{"href":61,"rel":62},"https://en.wikipedia.org/wiki/Color_quantization",[],"color quantization",", which will reduce the number of distinct colors in the image.",[12,66,67,68,73,74,79],{},"The ",[42,69,72],{"href":70,"rel":71},"https://pngquant.org/",[],"pngquant"," command line utility is the perfect tool for this job, and if you've used the popular ",[42,75,78],{"href":76,"rel":77},"https://pngmini.com/",[],"ImageAlpha"," tool, you've already used the pngquant library.",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-bash shiki shiki-themes github-light","# Install pngquant using Homebrew\n\nbrew install pngquant\n\n# Quantize 32-bit RGBA PNG to 8-bit (or smaller) RGBA-palette\n# pngquant [number of colors] [options] input.png\n#   --skip-if-larger  only save converted file if they're smaller than original\n#   --strip           remove optional metadata\n#   --ext=.png        set output filename to be same as input filename\n#   --force           overwrite existing output files\n\npngquant 256 --skip-if-larger --strip --ext=.png --force example.png\n","bash","",[88,89,90,99,106,120,125,131,137,143,149,155,161,166],"code",{"__ignoreMap":86},[91,92,95],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"sAwPA","# Install pngquant using Homebrew\n",[91,100,102],{"class":93,"line":101},2,[91,103,105],{"emptyLinePlaceholder":104},true,"\n",[91,107,109,113,117],{"class":93,"line":108},3,[91,110,112],{"class":111},"s7eDp","brew",[91,114,116],{"class":115},"sYBdl"," install",[91,118,119],{"class":115}," pngquant\n",[91,121,123],{"class":93,"line":122},4,[91,124,105],{"emptyLinePlaceholder":104},[91,126,128],{"class":93,"line":127},5,[91,129,130],{"class":97},"# Quantize 32-bit RGBA PNG to 8-bit (or smaller) RGBA-palette\n",[91,132,134],{"class":93,"line":133},6,[91,135,136],{"class":97},"# pngquant [number of colors] [options] input.png\n",[91,138,140],{"class":93,"line":139},7,[91,141,142],{"class":97},"#   --skip-if-larger  only save converted file if they're smaller than original\n",[91,144,146],{"class":93,"line":145},8,[91,147,148],{"class":97},"#   --strip           remove optional metadata\n",[91,150,152],{"class":93,"line":151},9,[91,153,154],{"class":97},"#   --ext=.png        set output filename to be same as input filename\n",[91,156,158],{"class":93,"line":157},10,[91,159,160],{"class":97},"#   --force           overwrite existing output files\n",[91,162,164],{"class":93,"line":163},11,[91,165,105],{"emptyLinePlaceholder":104},[91,167,169,171,175,178,181,184,187],{"class":93,"line":168},12,[91,170,72],{"class":111},[91,172,174],{"class":173},"sYu0t"," 256",[91,176,177],{"class":173}," --skip-if-larger",[91,179,180],{"class":173}," --strip",[91,182,183],{"class":173}," --ext=.png",[91,185,186],{"class":173}," --force",[91,188,189],{"class":115}," example.png\n",[12,191,192],{},"The screenshots below illustrate different levels of palette size reduction.",[194,195,196,215],"table",{},[197,198,199],"thead",{},[200,201,202,206,209,212],"tr",{},[203,204,205],"th",{},"PNG-32 (134 KB)",[203,207,208],{},"256 colors (42 KB)",[203,210,211],{},"128 colors (39 KB)",[203,213,214],{},"64 colors (38 KB)",[216,217,218],"tbody",{},[200,219,220,231,240,249],{},[221,222,223],"td",{},[42,224,227],{"href":225,"rel":226},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398843/blog/Content%20Images/png-compression/example.raw.png",[],[228,229],"img",{"alt":230,"src":225},"Source PNG-32",[221,232,233],{},[42,234,237],{"href":235,"rel":236},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398843/blog/Content%20Images/png-compression/example.256.png",[],[228,238],{"alt":239,"src":235},"256 colors",[221,241,242],{},[42,243,246],{"href":244,"rel":245},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398842/blog/Content%20Images/png-compression/example.128.png",[],[228,247],{"alt":248,"src":244},"128 colors",[221,250,251],{},[42,252,255],{"href":253,"rel":254},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398843/blog/Content%20Images/png-compression/example.64.png",[],[228,256],{"alt":257,"src":253},"64 colors",[12,259,260],{},"I've observed for most screenshots you can comfortably reduce the color palette to as few as 64 colors before the difference in image quality becomes noticeable. If you frequently take screenshots of gradients or more complex images, you may want to stick with 256 colors to avoid noticeable artifacts.",[52,262,264],{"id":263},"lossless-compression-deflate","Lossless Compression: DEFLATE",[12,266,267,268,273],{},"The PNG image file format uses ",[42,269,272],{"href":270,"rel":271},"https://en.wikipedia.org/wiki/DEFLATE",[],"DEFLATE"," compression internally for an added layer of lossless compression, but most\nPNG libraries do not implement aggressive lossless compression. This provides another opportunity to reduce the file size further.",[12,275,276,277,282,283,289],{},"In 2013, Google released ",[42,278,281],{"href":279,"rel":280},"https://github.com/google/zopfli",[],"zopfli",", which claimed to ",[15,284,285,286],{},"improve compression by 3-8% compared to ",[88,287,288],{},"zlib",". The trade off for this improvement: waiting an extra 1-2 seconds. (There is no decompression penalty when viewing the compressed image).",[81,291,293],{"className":83,"code":292,"language":85,"meta":86,"style":86},"# Install zopfli using Homebrew, which includes zopflipng\n\nbrew install zopfli\n\n# Optimize PNG compression\n# zopflipng [options] input.png output.png\n#   -y  do not ask about overwriting files\nzopflipng -y example.png example.png\n",[88,294,295,300,304,313,317,322,327,332],{"__ignoreMap":86},[91,296,297],{"class":93,"line":94},[91,298,299],{"class":97},"# Install zopfli using Homebrew, which includes zopflipng\n",[91,301,302],{"class":93,"line":101},[91,303,105],{"emptyLinePlaceholder":104},[91,305,306,308,310],{"class":93,"line":108},[91,307,112],{"class":111},[91,309,116],{"class":115},[91,311,312],{"class":115}," zopfli\n",[91,314,315],{"class":93,"line":122},[91,316,105],{"emptyLinePlaceholder":104},[91,318,319],{"class":93,"line":127},[91,320,321],{"class":97},"# Optimize PNG compression\n",[91,323,324],{"class":93,"line":133},[91,325,326],{"class":97},"# zopflipng [options] input.png output.png\n",[91,328,329],{"class":93,"line":139},[91,330,331],{"class":97},"#   -y  do not ask about overwriting files\n",[91,333,334,337,340,343],{"class":93,"line":145},[91,335,336],{"class":111},"zopflipng",[91,338,339],{"class":173}," -y",[91,341,342],{"class":115}," example.png",[91,344,189],{"class":115},[12,346,347],{},"Relative to the massive savings from color quantization, improving lossless compression provides a much smaller reduction, but in the context of pages with many images these marginal gains do add up to worthwhile savings.",[12,349,350],{},[228,351],{"alt":352,"src":353},"Chart: file size savings","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398842/blog/Content%20Images/png-compression/chart.png",[52,355,357],{"id":356},"automation","Automation",[12,359,360,361,366,367,372],{},"The trick is to make this happen automatically every time I capture a screenshot using ",[42,362,365],{"href":363,"rel":364},"https://www.noodlesoft.com/",[],"Hazel"," or ",[42,368,371],{"href":369,"rel":370},"https://support.apple.com/en-au/guide/automator/welcome/mac",[],"Automator",".\nThis allows you to run commands based on file events, like every time a new screenshot is added to a directory.",[12,374,375],{},"A bonus trick, is to create a dedicated Screenshots directory, so that they don't clutter your desktop. This is also easy:",[81,377,379],{"className":83,"code":378,"language":85,"meta":86,"style":86},"# Create a Screenshots directory in the current users Home directory\n\nmkdir -p \"$HOME/Screenshots\"\n\n# Configure macOS to capture screenshots to this location\n# If you want to revert this change, and save screenshots to your desktop,\n# instead use \"$HOME/Desktop\"\n\ndefaults write com.apple.screencapture location \"$HOME/Screenshots\"\n",[88,380,381,386,390,408,412,417,422,427,431],{"__ignoreMap":86},[91,382,383],{"class":93,"line":94},[91,384,385],{"class":97},"# Create a Screenshots directory in the current users Home directory\n",[91,387,388],{"class":93,"line":101},[91,389,105],{"emptyLinePlaceholder":104},[91,391,392,395,398,401,405],{"class":93,"line":108},[91,393,394],{"class":111},"mkdir",[91,396,397],{"class":173}," -p",[91,399,400],{"class":115}," \"",[91,402,404],{"class":403},"sgsFI","$HOME",[91,406,407],{"class":115},"/Screenshots\"\n",[91,409,410],{"class":93,"line":122},[91,411,105],{"emptyLinePlaceholder":104},[91,413,414],{"class":93,"line":127},[91,415,416],{"class":97},"# Configure macOS to capture screenshots to this location\n",[91,418,419],{"class":93,"line":133},[91,420,421],{"class":97},"# If you want to revert this change, and save screenshots to your desktop,\n",[91,423,424],{"class":93,"line":139},[91,425,426],{"class":97},"# instead use \"$HOME/Desktop\"\n",[91,428,429],{"class":93,"line":145},[91,430,105],{"emptyLinePlaceholder":104},[91,432,433,436,439,442,445,447,449],{"class":93,"line":151},[91,434,435],{"class":111},"defaults",[91,437,438],{"class":115}," write",[91,440,441],{"class":115}," com.apple.screencapture",[91,443,444],{"class":115}," location",[91,446,400],{"class":115},[91,448,404],{"class":403},[91,450,407],{"class":115},[12,452,453,454,457],{},"Using Hazel, add the Screenshots folder where newly captured screenshots will be created, and create a new rule to compress files when they are added.\nCombining the commands above, and using ",[88,455,456],{},"$1"," syntax to access the filename argument passed by Hazel, the final script is:",[81,459,461],{"className":83,"code":460,"language":85,"meta":86,"style":86},"pngquant 64 --skip-if-larger --strip --ext=.png --force \"$1\"\nzopflipng -y \"$1\" \"$1\"\n",[88,462,463,485],{"__ignoreMap":86},[91,464,465,467,470,472,474,476,478,480,482],{"class":93,"line":94},[91,466,72],{"class":111},[91,468,469],{"class":173}," 64",[91,471,177],{"class":173},[91,473,180],{"class":173},[91,475,183],{"class":173},[91,477,186],{"class":173},[91,479,400],{"class":115},[91,481,456],{"class":173},[91,483,484],{"class":115},"\"\n",[91,486,487,489,491,493,495,498,500,502],{"class":93,"line":101},[91,488,336],{"class":111},[91,490,339],{"class":173},[91,492,400],{"class":115},[91,494,456],{"class":173},[91,496,497],{"class":115},"\"",[91,499,400],{"class":115},[91,501,456],{"class":173},[91,503,484],{"class":115},[12,505,506,507,510,511,514,515,518,519,522],{},"Alternatively, using Automator, create a new ",[15,508,509],{},"Folder Action"," that receives notifications from the Screenshots folder. Add a ",[15,512,513],{},"Run Shell Script"," block, and make sure to ",[15,516,517],{},"Pass input as arguments",". Combining the commands above, and this time using ",[88,520,521],{},"$@"," syntax to handle multiple arguments, and absolute paths for pngquant and zopflipng, the final script is:",[81,524,526],{"className":83,"code":525,"language":85,"meta":86,"style":86},"for f in \"$@\"\ndo\n  /opt/homebrew/bin/pngquant 64 --skip-if-larger --strip --ext=.png --force \"$f\"\n  /opt/homebrew/bin/zopflipng -y \"$f\" \"$f\"\ndone\n",[88,527,528,546,551,573,592],{"__ignoreMap":86},[91,529,530,534,537,540,542,544],{"class":93,"line":94},[91,531,533],{"class":532},"sD7c4","for",[91,535,536],{"class":403}," f ",[91,538,539],{"class":532},"in",[91,541,400],{"class":115},[91,543,521],{"class":173},[91,545,484],{"class":115},[91,547,548],{"class":93,"line":101},[91,549,550],{"class":532},"do\n",[91,552,553,556,558,560,562,564,566,568,571],{"class":93,"line":108},[91,554,555],{"class":111},"  /opt/homebrew/bin/pngquant",[91,557,469],{"class":173},[91,559,177],{"class":173},[91,561,180],{"class":173},[91,563,183],{"class":173},[91,565,186],{"class":173},[91,567,400],{"class":115},[91,569,570],{"class":403},"$f",[91,572,484],{"class":115},[91,574,575,578,580,582,584,586,588,590],{"class":93,"line":122},[91,576,577],{"class":111},"  /opt/homebrew/bin/zopflipng",[91,579,339],{"class":173},[91,581,400],{"class":115},[91,583,570],{"class":403},[91,585,497],{"class":115},[91,587,400],{"class":115},[91,589,570],{"class":403},[91,591,484],{"class":115},[91,593,594],{"class":93,"line":127},[91,595,596],{"class":532},"done\n",[12,598,599,600,603,604,47],{},"The absolute paths for pngquant and zopflipng can vary depending on the version of Homebrew.\nYou can double check the exact path with ",[88,601,602],{},"which pngquant"," and ",[88,605,606],{},"which zopflipng",[12,608,609],{},"Here are screenshots of the configuration.",[194,611,612,620],{},[197,613,614],{},[200,615,616,618],{},[203,617,365],{},[203,619,371],{},[216,621,622],{},[200,623,624,633],{},[221,625,626],{},[42,627,630],{"href":628,"rel":629},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398843/blog/Content%20Images/png-compression/hazel.png",[],[228,631],{"alt":632,"src":628},"Hazel Screenshot Compression Rule",[221,634,635],{},[42,636,639],{"href":637,"rel":638},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398842/blog/Content%20Images/png-compression/automator.png",[],[228,640],{"alt":641,"src":637},"Automator Screenshot Compression Action",[12,643,644],{},"My final trick, is to add the Screenshots folder to my Dock for easy access.",[12,646,647],{},"This is achieved by dragging the Screenshots folder from Finder to your\nDock.",[52,649,651],{"id":650},"summary","Summary",[12,653,654],{},"The PNG file format is great for screenshots, but the defaults output is too large for sharing on the internet. Instead of using ImageAlpha and\nImageOptim to compress your screenshots by hand, you can use Hazel to automate this to regularly yield file size reductions of 80%.",[12,656,657],{},"If you know of compression tricks, or alternatives that work on Windows or Linux, let me know below in the comments!",[12,659,660,661,666,667],{},"Cover image by ",[42,662,665],{"href":663,"rel":664},"https://unsplash.com/@emsmith",[],"Emmy Smith"," on ",[42,668,671],{"href":669,"rel":670},"https://unsplash.com/photos/LEjEst7lLfU",[],"Unsplash",[673,674,675],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":86,"searchDepth":101,"depth":101,"links":677},[678,679,680,681],{"id":54,"depth":101,"text":55},{"id":263,"depth":101,"text":264},{"id":356,"depth":101,"text":357},{"id":650,"depth":101,"text":651},"unfiltered","2020-01-30","How to compress your screenshots automatically with pngquant and zopfli","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666775/Blog/Hero%20Images/cover.jpg",{},"/en-us/blog/simple-trick-for-smaller-screenshots",{"ogTitle":5,"ogImage":688,"ogDescription":684,"ogSiteName":692,"noIndex":687,"ogType":693,"ogUrl":694,"title":5,"canonicalUrls":694,"description":684},"https://about.gitlab.com","article","https://about.gitlab.com/blog/simple-trick-for-smaller-screenshots","simple-trick-for-smaller-screenshots","en-us/blog/simple-trick-for-smaller-screenshots",[698],"workflow","BlogPost","DJANCVgWFPbVeq3mrBMuFmRJ_xo4e53wk6LBOunzw_c",{"logo":702,"freeTrial":707,"sales":712,"login":717,"items":722,"search":1048,"minimal":1079,"duo":1098,"switchNav":1107,"pricingDeployment":1118},{"config":703},{"href":704,"dataGaName":705,"dataGaLocation":706},"/","gitlab logo","header",{"text":708,"config":709},"Get free trial",{"href":710,"dataGaName":711,"dataGaLocation":706},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":713,"config":714},"Request a demo",{"href":715,"dataGaName":716,"dataGaLocation":706},"/sales/?contact-topic=request-demo","sales",{"text":718,"config":719},"Sign in",{"href":720,"dataGaName":721,"dataGaLocation":706},"https://gitlab.com/users/sign_in/","sign in",[723,752,851,856,970,1026],{"text":724,"config":725,"menu":727},"Platform",{"dataNavLevelOne":726},"platform",{"type":728,"columns":729},"cards",[730,736,744],{"title":724,"description":731,"link":732},"The intelligent orchestration platform for DevSecOps",{"text":733,"config":734},"Explore our Platform",{"href":735,"dataGaName":726,"dataGaLocation":706},"/platform/",{"title":737,"description":738,"link":739},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":740,"config":741},"Meet GitLab Duo",{"href":742,"dataGaName":743,"dataGaLocation":706},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":745,"description":746,"link":747},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":748,"config":749},"Learn more",{"href":750,"dataGaName":751,"dataGaLocation":706},"/why-gitlab/","why gitlab",{"text":753,"left":104,"config":754,"menu":756},"Product",{"dataNavLevelOne":755},"solutions",{"type":757,"link":758,"columns":762,"feature":830},"lists",{"text":759,"config":760},"View all Solutions",{"href":761,"dataGaName":755,"dataGaLocation":706},"/solutions/",[763,786,809],{"title":357,"description":764,"link":765,"items":770},"CI/CD and automation to accelerate deployment",{"config":766},{"icon":767,"href":768,"dataGaName":769,"dataGaLocation":706},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[771,775,778,782],{"text":772,"config":773},"CI/CD",{"href":774,"dataGaLocation":706,"dataGaName":772},"/solutions/continuous-integration/",{"text":737,"config":776},{"href":742,"dataGaLocation":706,"dataGaName":777},"gitlab duo agent platform - product menu",{"text":779,"config":780},"Source Code Management",{"href":781,"dataGaLocation":706,"dataGaName":779},"/solutions/source-code-management/",{"text":783,"config":784},"Automated Software Delivery",{"href":768,"dataGaLocation":706,"dataGaName":785},"Automated software delivery",{"title":787,"description":788,"link":789,"items":794},"Security","Deliver code faster without compromising security",{"config":790},{"href":791,"dataGaName":792,"dataGaLocation":706,"icon":793},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[795,799,804],{"text":796,"config":797},"Application Security Testing",{"href":791,"dataGaName":798,"dataGaLocation":706},"Application security testing",{"text":800,"config":801},"Software Supply Chain Security",{"href":802,"dataGaLocation":706,"dataGaName":803},"/solutions/supply-chain/","Software supply chain security",{"text":805,"config":806},"Software Compliance",{"href":807,"dataGaName":808,"dataGaLocation":706},"/solutions/software-compliance/","software compliance",{"title":810,"link":811,"items":816},"Measurement",{"config":812},{"icon":813,"href":814,"dataGaName":815,"dataGaLocation":706},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[817,821,825],{"text":818,"config":819},"Visibility & Measurement",{"href":814,"dataGaLocation":706,"dataGaName":820},"Visibility and Measurement",{"text":822,"config":823},"Value Stream Management",{"href":824,"dataGaLocation":706,"dataGaName":822},"/solutions/value-stream-management/",{"text":826,"config":827},"Analytics & Insights",{"href":828,"dataGaLocation":706,"dataGaName":829},"/solutions/analytics-and-insights/","Analytics and insights",{"title":831,"type":757,"items":832},"GitLab for",[833,839,845],{"text":834,"config":835},"Enterprise",{"icon":836,"href":837,"dataGaLocation":706,"dataGaName":838},"Building","/enterprise/","enterprise",{"text":840,"config":841},"Small Business",{"icon":842,"href":843,"dataGaLocation":706,"dataGaName":844},"Work","/small-business/","small business",{"text":846,"config":847},"Public Sector",{"icon":848,"href":849,"dataGaLocation":706,"dataGaName":850},"Organization","/solutions/public-sector/","public sector",{"text":852,"config":853},"Pricing",{"href":854,"dataGaName":855,"dataGaLocation":706,"dataNavLevelOne":855},"/pricing/","pricing",{"text":857,"config":858,"menu":860},"Resources",{"dataNavLevelOne":859},"resources",{"type":757,"link":861,"columns":865,"feature":959},{"text":862,"config":863},"View all resources",{"href":864,"dataGaName":859,"dataGaLocation":706},"/resources/",[866,899,926],{"title":867,"items":868},"Getting started",[869,874,879,884,889,894],{"text":870,"config":871},"Install",{"href":872,"dataGaName":873,"dataGaLocation":706},"/install/","install",{"text":875,"config":876},"Quick start guides",{"href":877,"dataGaName":878,"dataGaLocation":706},"/get-started/","quick setup checklists",{"text":880,"config":881},"Learn",{"href":882,"dataGaLocation":706,"dataGaName":883},"https://university.gitlab.com/","learn",{"text":885,"config":886},"Product documentation",{"href":887,"dataGaName":888,"dataGaLocation":706},"https://docs.gitlab.com/","product documentation",{"text":890,"config":891},"Best practice videos",{"href":892,"dataGaName":893,"dataGaLocation":706},"/getting-started-videos/","best practice videos",{"text":895,"config":896},"Integrations",{"href":897,"dataGaName":898,"dataGaLocation":706},"/integrations/","integrations",{"title":900,"items":901},"Discover",[902,907,912,917,921],{"text":903,"config":904},"Customer success stories",{"href":905,"dataGaName":906,"dataGaLocation":706},"/customers/","customer success stories",{"text":908,"config":909},"Blog",{"href":910,"dataGaName":911,"dataGaLocation":706},"/blog/","blog",{"text":913,"config":914},"Demo Hub",{"href":915,"dataGaName":916,"dataGaLocation":706},"/demo-hub/","demo hub",{"text":918,"config":919},"The Source",{"href":920,"dataGaName":911,"dataGaLocation":706},"/the-source/",{"text":922,"config":923},"Remote",{"href":924,"dataGaName":925,"dataGaLocation":706},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":927,"items":928},"Connect",[929,934,939,944,949,954],{"text":930,"config":931},"GitLab Services",{"href":932,"dataGaName":933,"dataGaLocation":706},"/services/","services",{"text":935,"config":936},"Contribute",{"href":937,"dataGaName":938,"dataGaLocation":706},"https://contributors.gitlab.com","contribute",{"text":940,"config":941},"Community",{"href":942,"dataGaName":943,"dataGaLocation":706},"/community/","community",{"text":945,"config":946},"Forum",{"href":947,"dataGaName":948,"dataGaLocation":706},"https://forum.gitlab.com/","forum",{"text":950,"config":951},"Events",{"href":952,"dataGaName":953,"dataGaLocation":706},"/events/","events",{"text":955,"config":956},"Partners",{"href":957,"dataGaName":958,"dataGaLocation":706},"/partners/","partners",{"config":960,"title":963,"text":964,"link":965},{"background":961,"textColor":962},"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":966,"config":967},"Read the latest",{"href":968,"dataGaName":969,"dataGaLocation":706},"/whats-new/","whats new",{"text":971,"config":972,"menu":974},"Company",{"dataNavLevelOne":973},"company",{"type":757,"columns":975},[976],{"items":977},[978,983,989,991,996,1001,1006,1011,1016,1021],{"text":979,"config":980},"About",{"href":981,"dataGaName":982,"dataGaLocation":706},"/company/","about",{"text":984,"config":985,"footerGa":988},"Jobs",{"href":986,"dataGaName":987,"dataGaLocation":706},"/jobs/","jobs",{"dataGaName":987},{"text":950,"config":990},{"href":952,"dataGaName":953,"dataGaLocation":706},{"text":992,"config":993},"Leadership",{"href":994,"dataGaName":995,"dataGaLocation":706},"/company/team/e-group/","leadership",{"text":997,"config":998},"Handbook",{"href":999,"dataGaName":1000,"dataGaLocation":706},"https://handbook.gitlab.com/","handbook",{"text":1002,"config":1003},"Investor relations",{"href":1004,"dataGaName":1005,"dataGaLocation":706},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1007,"config":1008},"Trust Center",{"href":1009,"dataGaName":1010,"dataGaLocation":706},"/security/","trust center",{"text":1012,"config":1013},"AI Transparency Center",{"href":1014,"dataGaName":1015,"dataGaLocation":706},"/ai-transparency-center/","ai transparency center",{"text":1017,"config":1018},"Newsletter",{"href":1019,"dataGaName":1020,"dataGaLocation":706},"/company/contact/#contact-forms","newsletter",{"text":1022,"config":1023},"Press",{"href":1024,"dataGaName":1025,"dataGaLocation":706},"/press/","press",{"text":1027,"config":1028,"menu":1029},"Contact us",{"dataNavLevelOne":973},{"type":757,"columns":1030},[1031],{"items":1032},[1033,1038,1043],{"text":1034,"config":1035},"Talk to sales",{"href":1036,"dataGaName":1037,"dataGaLocation":706},"/sales/","talk to sales",{"text":1039,"config":1040},"Support portal",{"href":1041,"dataGaName":1042,"dataGaLocation":706},"https://support.gitlab.com/hc/en-us","support portal",{"text":1044,"config":1045},"Customer portal",{"href":1046,"dataGaName":1047,"dataGaLocation":706},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1049,"login":1050,"suggestions":1057},"Close",{"text":1051,"link":1052},"To search repositories and projects, login to",{"text":1053,"config":1054},"gitlab.com",{"href":720,"dataGaName":1055,"dataGaLocation":1056},"search login","search",{"text":1058,"default":1059},"Suggestions",[1060,1062,1066,1068,1072,1076],{"text":737,"config":1061},{"href":742,"dataGaName":737,"dataGaLocation":1056},{"text":1063,"config":1064},"Code Suggestions (AI)",{"href":1065,"dataGaName":1063,"dataGaLocation":1056},"/solutions/code-suggestions/",{"text":772,"config":1067},{"href":774,"dataGaName":772,"dataGaLocation":1056},{"text":1069,"config":1070},"GitLab on AWS",{"href":1071,"dataGaName":1069,"dataGaLocation":1056},"/partners/technology-partners/aws/",{"text":1073,"config":1074},"GitLab on Google Cloud",{"href":1075,"dataGaName":1073,"dataGaLocation":1056},"/partners/technology-partners/google-cloud-platform/",{"text":1077,"config":1078},"Why GitLab?",{"href":750,"dataGaName":1077,"dataGaLocation":1056},{"freeTrial":1080,"mobileIcon":1085,"desktopIcon":1090,"secondaryButton":1093},{"text":1081,"config":1082},"Start free trial",{"href":1083,"dataGaName":711,"dataGaLocation":1084},"https://gitlab.com/-/trials/new/","nav",{"altText":1086,"config":1087},"Gitlab Icon",{"src":1088,"dataGaName":1089,"dataGaLocation":1084},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1086,"config":1091},{"src":1092,"dataGaName":1089,"dataGaLocation":1084},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1094,"config":1095},"Get Started",{"href":1096,"dataGaName":1097,"dataGaLocation":1084},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1099,"mobileIcon":1103,"desktopIcon":1105},{"text":1100,"config":1101},"Learn more about GitLab Duo",{"href":742,"dataGaName":1102,"dataGaLocation":1084},"gitlab duo",{"altText":1086,"config":1104},{"src":1088,"dataGaName":1089,"dataGaLocation":1084},{"altText":1086,"config":1106},{"src":1092,"dataGaName":1089,"dataGaLocation":1084},{"button":1108,"mobileIcon":1113,"desktopIcon":1115},{"text":1109,"config":1110},"/switch",{"href":1111,"dataGaName":1112,"dataGaLocation":1084},"#contact","switch",{"altText":1086,"config":1114},{"src":1088,"dataGaName":1089,"dataGaLocation":1084},{"altText":1086,"config":1116},{"src":1117,"dataGaName":1089,"dataGaLocation":1084},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1119,"mobileIcon":1124,"desktopIcon":1126},{"text":1120,"config":1121},"Back to pricing",{"href":854,"dataGaName":1122,"dataGaLocation":1084,"icon":1123},"back to pricing","GoBack",{"altText":1086,"config":1125},{"src":1088,"dataGaName":1089,"dataGaLocation":1084},{"altText":1086,"config":1127},{"src":1092,"dataGaName":1089,"dataGaLocation":1084},{"title":1129,"titleMobile":1130,"button":1131,"config":1136},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":748,"config":1132},{"href":1133,"dataGaName":1134,"dataGaLocation":1135},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1137,"disabled":687},"release",{"data":1139},{"text":1140,"source":1141,"edit":1147,"contribute":1152,"config":1157,"items":1162,"minimal":1372},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1142,"config":1143},"View page source",{"href":1144,"dataGaName":1145,"dataGaLocation":1146},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1148,"config":1149},"Edit this page",{"href":1150,"dataGaName":1151,"dataGaLocation":1146},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1153,"config":1154},"Please contribute",{"href":1155,"dataGaName":1156,"dataGaLocation":1146},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1158,"facebook":1159,"youtube":1160,"linkedin":1161},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1163,1210,1264,1308,1340],{"title":852,"links":1164,"subMenu":1179},[1165,1169,1174],{"text":1166,"config":1167},"View plans",{"href":854,"dataGaName":1168,"dataGaLocation":1146},"view plans",{"text":1170,"config":1171},"Why Premium?",{"href":1172,"dataGaName":1173,"dataGaLocation":1146},"/pricing/premium/","why premium",{"text":1175,"config":1176},"Why Ultimate?",{"href":1177,"dataGaName":1178,"dataGaLocation":1146},"/pricing/ultimate/","why ultimate",[1180],{"title":1181,"links":1182},"Contact Us",[1183,1186,1188,1190,1195,1200,1205],{"text":1184,"config":1185},"Contact sales",{"href":1036,"dataGaName":716,"dataGaLocation":1146},{"text":1039,"config":1187},{"href":1041,"dataGaName":1042,"dataGaLocation":1146},{"text":1044,"config":1189},{"href":1046,"dataGaName":1047,"dataGaLocation":1146},{"text":1191,"config":1192},"Status",{"href":1193,"dataGaName":1194,"dataGaLocation":1146},"https://status.gitlab.com/","status",{"text":1196,"config":1197},"Terms of use",{"href":1198,"dataGaName":1199,"dataGaLocation":1146},"/terms/","terms of use",{"text":1201,"config":1202},"Privacy statement",{"href":1203,"dataGaName":1204,"dataGaLocation":1146},"/privacy/","privacy statement",{"text":1206,"config":1207},"Cookie preferences",{"dataGaName":1208,"dataGaLocation":1146,"id":1209,"isOneTrustButton":104},"cookie preferences","ot-sdk-btn",{"title":753,"links":1211,"subMenu":1220},[1212,1216],{"text":1213,"config":1214},"DevSecOps platform",{"href":735,"dataGaName":1215,"dataGaLocation":1146},"devsecops platform",{"text":1217,"config":1218},"AI-Assisted Development",{"href":742,"dataGaName":1219,"dataGaLocation":1146},"ai-assisted development",[1221],{"title":1222,"links":1223},"Topics",[1224,1229,1234,1239,1244,1249,1254,1259],{"text":1225,"config":1226},"CICD",{"href":1227,"dataGaName":1228,"dataGaLocation":1146},"/topics/ci-cd/","cicd",{"text":1230,"config":1231},"GitOps",{"href":1232,"dataGaName":1233,"dataGaLocation":1146},"/topics/gitops/","gitops",{"text":1235,"config":1236},"DevOps",{"href":1237,"dataGaName":1238,"dataGaLocation":1146},"/topics/devops/","devops",{"text":1240,"config":1241},"Version Control",{"href":1242,"dataGaName":1243,"dataGaLocation":1146},"/topics/version-control/","version control",{"text":1245,"config":1246},"DevSecOps",{"href":1247,"dataGaName":1248,"dataGaLocation":1146},"/topics/devsecops/","devsecops",{"text":1250,"config":1251},"Cloud Native",{"href":1252,"dataGaName":1253,"dataGaLocation":1146},"/topics/cloud-native/","cloud native",{"text":1255,"config":1256},"AI for Coding",{"href":1257,"dataGaName":1258,"dataGaLocation":1146},"/topics/devops/ai-for-coding/","ai for coding",{"text":1260,"config":1261},"Agentic AI",{"href":1262,"dataGaName":1263,"dataGaLocation":1146},"/topics/agentic-ai/","agentic ai",{"title":1265,"links":1266},"Solutions",[1267,1269,1271,1276,1280,1283,1287,1290,1292,1295,1298,1303],{"text":796,"config":1268},{"href":791,"dataGaName":796,"dataGaLocation":1146},{"text":785,"config":1270},{"href":768,"dataGaName":769,"dataGaLocation":1146},{"text":1272,"config":1273},"Agile development",{"href":1274,"dataGaName":1275,"dataGaLocation":1146},"/solutions/agile-delivery/","agile delivery",{"text":1277,"config":1278},"SCM",{"href":781,"dataGaName":1279,"dataGaLocation":1146},"source code management",{"text":1225,"config":1281},{"href":774,"dataGaName":1282,"dataGaLocation":1146},"continuous integration & delivery",{"text":1284,"config":1285},"Value stream management",{"href":824,"dataGaName":1286,"dataGaLocation":1146},"value stream management",{"text":1230,"config":1288},{"href":1289,"dataGaName":1233,"dataGaLocation":1146},"/solutions/gitops/",{"text":834,"config":1291},{"href":837,"dataGaName":838,"dataGaLocation":1146},{"text":1293,"config":1294},"Small business",{"href":843,"dataGaName":844,"dataGaLocation":1146},{"text":1296,"config":1297},"Public sector",{"href":849,"dataGaName":850,"dataGaLocation":1146},{"text":1299,"config":1300},"Education",{"href":1301,"dataGaName":1302,"dataGaLocation":1146},"/solutions/education/","education",{"text":1304,"config":1305},"Financial services",{"href":1306,"dataGaName":1307,"dataGaLocation":1146},"/solutions/finance/","financial services",{"title":857,"links":1309},[1310,1312,1314,1316,1319,1321,1324,1326,1328,1330,1332,1334,1336,1338],{"text":870,"config":1311},{"href":872,"dataGaName":873,"dataGaLocation":1146},{"text":875,"config":1313},{"href":877,"dataGaName":878,"dataGaLocation":1146},{"text":880,"config":1315},{"href":882,"dataGaName":883,"dataGaLocation":1146},{"text":885,"config":1317},{"href":887,"dataGaName":1318,"dataGaLocation":1146},"docs",{"text":908,"config":1320},{"href":910,"dataGaName":911,"dataGaLocation":1146},{"text":1322,"config":1323},"What's new",{"href":968,"dataGaName":969,"dataGaLocation":1146},{"text":903,"config":1325},{"href":905,"dataGaName":906,"dataGaLocation":1146},{"text":922,"config":1327},{"href":924,"dataGaName":925,"dataGaLocation":1146},{"text":930,"config":1329},{"href":932,"dataGaName":933,"dataGaLocation":1146},{"text":935,"config":1331},{"href":937,"dataGaName":938,"dataGaLocation":1146},{"text":940,"config":1333},{"href":942,"dataGaName":943,"dataGaLocation":1146},{"text":945,"config":1335},{"href":947,"dataGaName":948,"dataGaLocation":1146},{"text":950,"config":1337},{"href":952,"dataGaName":953,"dataGaLocation":1146},{"text":955,"config":1339},{"href":957,"dataGaName":958,"dataGaLocation":1146},{"title":971,"links":1341},[1342,1344,1346,1348,1350,1352,1356,1361,1363,1365,1367],{"text":979,"config":1343},{"href":981,"dataGaName":973,"dataGaLocation":1146},{"text":984,"config":1345},{"href":986,"dataGaName":987,"dataGaLocation":1146},{"text":992,"config":1347},{"href":994,"dataGaName":995,"dataGaLocation":1146},{"text":997,"config":1349},{"href":999,"dataGaName":1000,"dataGaLocation":1146},{"text":1002,"config":1351},{"href":1004,"dataGaName":1005,"dataGaLocation":1146},{"text":1353,"config":1354},"Sustainability",{"href":1355,"dataGaName":1353,"dataGaLocation":1146},"/sustainability/",{"text":1357,"config":1358},"Diversity, inclusion and belonging (DIB)",{"href":1359,"dataGaName":1360,"dataGaLocation":1146},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1007,"config":1362},{"href":1009,"dataGaName":1010,"dataGaLocation":1146},{"text":1017,"config":1364},{"href":1019,"dataGaName":1020,"dataGaLocation":1146},{"text":1022,"config":1366},{"href":1024,"dataGaName":1025,"dataGaLocation":1146},{"text":1368,"config":1369},"Modern Slavery Transparency Statement",{"href":1370,"dataGaName":1371,"dataGaLocation":1146},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1373},[1374,1377,1380],{"text":1375,"config":1376},"Terms",{"href":1198,"dataGaName":1199,"dataGaLocation":1146},{"text":1378,"config":1379},"Cookies",{"dataGaName":1208,"dataGaLocation":1146,"id":1209,"isOneTrustButton":104},{"text":1381,"config":1382},"Privacy",{"href":1203,"dataGaName":1204,"dataGaLocation":1146},[1384],{"id":1385,"title":7,"body":686,"config":1386,"content":1388,"description":686,"extension":1391,"meta":1392,"navigation":104,"path":1393,"seo":1394,"stem":1395,"__hash__":1396},"blogAuthors/en-us/blog/authors/james-ramsay.yml",{"template":1387},"BlogAuthor",{"name":7,"config":1389},{"headshot":86,"ctfId":1390},"jramsay","yml",{},"/en-us/blog/authors/james-ramsay",{},"en-us/blog/authors/james-ramsay","iKU7kqEnGoklxsvYnqw2L7oAOICkVwJOVHAkOv_GdM4",[1398,1406,1414],{"title":1399,"description":1400,"heroImage":1401,"category":682,"date":1402,"authors":1403,"slug":1405,"externalUrl":686},"CEO Shadow Takeaways from Jacie","Recap of my experience in the CEO Shadow Program.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664102/Blog/Hero%20Images/gitlab-values-cover.png","2021-05-18",[1404],"Jacie Bandur","ceo-shadow-recap",{"title":1407,"description":1408,"heroImage":1409,"category":682,"date":1410,"authors":1411,"slug":1413,"externalUrl":686},"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",[1412],"Austin Regnery","why-i-love-contributing-to-gitlab",{"title":1415,"description":1416,"heroImage":1417,"category":682,"date":1410,"authors":1418,"slug":1420,"externalUrl":686},"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",[1419],"Sam Beckham","placebo-lines-on-the-pipeline-graph",{"promotions":1422},[1423,1437,1449,1461],{"id":1424,"categories":1425,"header":1427,"text":1428,"button":1429,"image":1434},"ai-modernization",[1426],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1430,"config":1431},"Get your AI maturity score",{"href":1432,"dataGaName":1433,"dataGaLocation":911},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1435},{"src":1436},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1438,"categories":1439,"header":1441,"text":1428,"button":1442,"image":1446},"devops-modernization",[1440,1248],"product","Are you just managing tools or shipping innovation?",{"text":1443,"config":1444},"Get your DevOps maturity score",{"href":1445,"dataGaName":1433,"dataGaLocation":911},"/assessments/devops-modernization-assessment/",{"config":1447},{"src":1448},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1450,"categories":1451,"header":1453,"text":1428,"button":1454,"image":1458},"security-modernization",[1452],"security","Are you trading speed for security?",{"text":1455,"config":1456},"Get your security maturity score",{"href":1457,"dataGaName":1433,"dataGaLocation":911},"/assessments/security-modernization-assessment/",{"config":1459},{"src":1460},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1462,"paths":1463,"header":1466,"text":1467,"button":1468,"image":1473},"github-azure-migration",[1464,1465],"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":1469,"config":1470},"See how GitLab compares to GitHub",{"href":1471,"dataGaName":1472,"dataGaLocation":911},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1474},{"src":1448},{"header":1476,"blurb":1477,"button":1478,"secondaryButton":1483},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1479,"config":1480},"Get your free trial",{"href":1481,"dataGaName":711,"dataGaLocation":1482},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1184,"config":1484},{"href":1036,"dataGaName":716,"dataGaLocation":1482},1786803754670]