[{"data":1,"prerenderedAt":1177},["ShallowReactive",2],{"/blog/managing-your-snowflake-spend-with-periscope-and-dbt":3,"navigation-en-us":381,"banner-en-us":808,"footer-en-us":818,"blog-post-authors-en-us-Taylor Murphy|Emilie Schario":1063,"blog-related-posts-en-us-managing-your-snowflake-spend-with-periscope-and-dbt":1088,"blog-promotions-en-us":1113,"next-steps-en-us":1167},{"id":4,"title":5,"authors":6,"body":9,"category":358,"date":359,"description":360,"extension":361,"externalUrl":362,"faq":362,"featured":363,"heroImage":364,"meta":365,"navigation":366,"path":367,"seo":368,"slug":372,"stem":373,"tags":374,"template":379,"updatedDate":362,"__hash__":380},"blogPosts/en-us/blog/managing-your-snowflake-spend-with-periscope-and-dbt.md","How to manage your Snowflake spend with Periscope and dbt",[7,8],"Taylor Murphy","Emilie Schario",{"type":10,"value":11,"toc":349},"minimark",[12,16,29,34,37,45,50,53,63,67,70,79,83,86,90,93,101,105,119,127,170,177,220,227,244,251,281,293,304,313,320,323,331,345],[13,14,15],"p",{},"On the data team at GitLab, we are grateful to be empowered with best in-class tools that enable us to produce high-quality work. At the 2018 DataEngConf (now Data Council), GitLab data engineer Thomas La Piana spoke about how a team of three was supporting the data needs of a billion-dollar company. As he explains in this talk, we focus a lot on processes and workflows.",[17,18,21,22],"figure",{"className":19},[20],"video_container","\n  ",[23,24,28],"iframe",{"src":25,"frameBorder":26,"allowFullScreen":27},"https://www.youtube.com/embed/eu623QBwakc","0","true"," ",[30,31,33],"h2",{"id":32},"where-are-the-existing-gaps","Where are the existing gaps?",[13,35,36],{},"Today, the data team has grown from three to seven: three engineers and four analysts.\nSince we've more than doubled in the last six months, we've had to take a step back and revisit our processes.",[13,38,39,44],{},[40,41],"img",{"alt":42,"src":43},"GitLab Team Headcount","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399209/blog/Content%20Images/team_headcount.png","\nThe GitLab team has grown significantly in the past few months.",[46,47,49],"h3",{"id":48},"gitlab-is-growing-fast","GitLab is growing fast",[13,51,52],{},"Despite the significant jump in the data team's headcount, our growth has not matched the exponential growth of the team supporting GitLab.\nAs GitLab grows, more folks aim to include more data in their decision-making process.\nThis means we're iterating quickly, collecting feedback, and constantly improving on the quality of the analyses we are producing for our business stakeholders.\nThe demand for more data means there is a lot more to accomplish – making now an opportune time to review our processes and improve the data team's impact across GitLab.",[13,54,55,56,62],{},"For example, a data team member pointed out that refinement isn't a part of our ",[57,58,61],"a",{"href":59,"rel":60},"https://handbook.gitlab.com/handbook/enterprise-data/how-we-work/#milestone-planning",[],"milestone planning process",".\nNo wonder our backlog wasn't moving anywhere! We identified the root of the problem by asking our team, \"What is the problem we're trying to solve?\" and then laid out a plan to address it.",[46,64,66],{"id":65},"onboarding-can-be-hard","Onboarding can be hard",[13,68,69],{},"We've made some great data analyst hires recently!\nWe don't require our new team members to be familiar with our existing data stack (Stitch/Singer - Snowflake - dbt - Periscope), but we do require them to have technical skills that match their role.\nThis usually includes Git, SQL, and Python (Pandas) at the bare minimum, though we welcome R (tidyverse) as well.\nWhile onboarding at any company can be difficult, it's especially challenging in an all-remote organization such as GitLab.",[13,71,72,73,78],{},"In addition to introducing candidates to our specific technologies, part of the ",[57,74,77],{"href":75,"rel":76},"https://gitlab.com/gitlab-data/analytics/blob/master/.gitlab/issue_templates/data_onboarding.md",[],"data analyst onboarding"," includes a unit on resource consumption.\nWe spend time introducing the concepts of databases and warehouses in Snowflake, because storage and compute being separate are often novel ideas to folks joining GitLab from an on-premise data organization.\nIn some cases, we are teaching our new hires a new way to think about the data-related problems they're solving, and introducing different resources to remedy these problems.",[46,80,82],{"id":81},"with-great-power-comes-great-responsibility","With great power comes great responsibility",[13,84,85],{},"We consume more resources as the data team headcount grows. I think about this like folks using water in a household. If everyone is on vacation, the water bill will be low, but if all the cousins come visit for a week, the bill will be high.\nSimilarly to why we encourage a big group of visiting relatives to take shorter showers to conserve water, on the data team we work to steward resources effectively. This means we must identify wasted resources to recapture them.\nIt's important that our operating expenses not balloon with headcount.",[30,87,89],{"id":88},"are-you-protected-against-a-leak","Are you protected against a leak?",[13,91,92],{},"As a homeowner, I can share a myriad of appliance-gone-wrong stories, but one tops them all: the time there was a leak in our front yard that we only discovered because of a $1,000 water bill.\nOften, homeowners can only measure water usage when the bill arrives, when it's always too late to fix it.",[13,94,95,96,100],{},"Lucky for our team and yours, Snowflake is much more generous than my water company.\nWe ",[97,98,99],"em",{},"can"," monitor our costs as it accrues.\nAfter having this process in place for a bit now, we'd encourage you to implement it in your stack.",[30,102,104],{"id":103},"monitor-your-snowflake-spend-with-dbt-and-periscope","Monitor your Snowflake spend with dbt and Periscope",[13,106,107,108,113,114,118],{},"We're excited to make our ",[57,109,112],{"href":110,"rel":111},"https://gitlab.com/gitlab-data/snowflake_spend",[],"Snowflake spend dbt package"," widely available for use.\nDoing this is in line with our belief in the value of ",[57,115,117],{"href":116},"/blog/open-source-analytics/","open source analytics",".",[13,120,121,122,126],{},"To get started, you'll need to grant access to the ",[123,124,125],"code",{},"snowflake"," database to your dbt-specific role with:",[128,129,134],"pre",{"className":130,"code":131,"language":132,"meta":133,"style":133},"language-sql shiki shiki-themes github-light","GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE \u003Crole>;\n","sql","",[123,135,136],{"__ignoreMap":133},[137,138,141,145,149,152,155,158,161,164,167],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sD7c4","GRANT",[137,146,148],{"class":147},"sgsFI"," IMPORTED PRIVILEGES ",[137,150,151],{"class":143},"ON",[137,153,154],{"class":143}," DATABASE",[137,156,157],{"class":147}," snowflake ",[137,159,160],{"class":143},"TO",[137,162,163],{"class":143}," ROLE",[137,165,166],{"class":143}," \u003Crole>",[137,168,169],{"class":147},";\n",[13,171,172,173,176],{},"Then you'll need to update the ",[123,174,175],{},"packages.yml"," file in your dbt project to include the following:",[128,178,182],{"className":179,"code":180,"language":181,"meta":133,"style":133},"language-yaml shiki shiki-themes github-light","packages:\n  - git: https://gitlab.com/gitlab-data/snowflake_spend.git\n    revision: v1.0.0\n\n","yaml",[123,183,184,193,209],{"__ignoreMap":133},[137,185,186,190],{"class":139,"line":140},[137,187,189],{"class":188},"shJU0","packages",[137,191,192],{"class":147},":\n",[137,194,196,199,202,205],{"class":139,"line":195},2,[137,197,198],{"class":147},"  - ",[137,200,201],{"class":188},"git",[137,203,204],{"class":147},": ",[137,206,208],{"class":207},"sYBdl","https://gitlab.com/gitlab-data/snowflake_spend.git\n",[137,210,212,215,217],{"class":139,"line":211},3,[137,213,214],{"class":188},"    revision",[137,216,204],{"class":147},[137,218,219],{"class":207},"v1.0.0\n",[13,221,222,223,226],{},"Today, you can only install the package directly from Git.\nSince it doesn't depend on any other packages, you don't have to worry about version management, so this should not cause any problems.\nYou can run ",[123,224,225],{},"dbt deps"," to ensure the package is installed correctly.",[13,228,229,230,233,234,239,240,243],{},"You will need a csv called ",[123,231,232],{},"snowflake_contract_rates.csv"," which has two columns: effective date and rate. The effective date is the day the new contracted rate started and it should be in YYYY-MM-DD format. The rate is the per credit price for the given time period. You can see how the data team configures ",[57,235,238],{"href":236,"rel":237},"https://gitlab.com/gitlab-data/analytics/blob/master/transform/snowflake-dbt/data/snowflake_contract_rates.csv",[],"their csv file",". You will need to run ",[123,241,242],{},"dbt seed"," for the csv to be loaded as a table and for the model to run succesfully.",[13,245,246,247,250],{},"Finally, you will need to update your ",[123,248,249],{},"dbt_project.yml"," file to enable this package with the following block.",[128,252,254],{"className":179,"code":253,"language":181,"meta":133,"style":133},"models:\n  snowflake_spend:\n    enabled: true\n\n",[123,255,256,263,270],{"__ignoreMap":133},[137,257,258,261],{"class":139,"line":140},[137,259,260],{"class":188},"models",[137,262,192],{"class":147},[137,264,265,268],{"class":139,"line":195},[137,266,267],{"class":188},"  snowflake_spend",[137,269,192],{"class":147},[137,271,272,275,277],{"class":139,"line":211},[137,273,274],{"class":188},"    enabled",[137,276,204],{"class":147},[137,278,280],{"class":279},"sYu0t","true\n",[13,282,283,284,289,290,292],{},"You can see ",[57,285,288],{"href":286,"rel":287},"https://gitlab.com/gitlab-data/analytics/blob/master/transform/snowflake-dbt/dbt_project.yml#L68",[],"how the data team has configured the package"," in our ",[123,291,249],{}," file.",[13,294,295,296,299,300,303],{},"Running ",[123,297,298],{},"dbt compile"," will not only test that you've configured all of this correctly, but also will compile the files in the ",[123,301,302],{},"analysis"," directory. These are the queries that we use to underlie the exact Periscope dashboard that we have automatically posted in Slack every day.",[13,305,306,310],{},[40,307],{"alt":308,"src":309},"GitLab's Periscope dashboard for managing Snowflake spend","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398820/blog/Content%20Images/periscope_snowflake_spend1.png",[40,311],{"alt":308,"src":312},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398821/blog/Content%20Images/periscope_snowflake_spend2.png",[13,314,315,316,319],{},"Once you've set up this dashboard, you can configure it to auto-refresh daily.\nThen use Slack's ",[123,317,318],{},"/remind app.periscopedata.com/dashboardurl"," to have it regularly publish in the channel of your choice.",[13,321,322],{},"You can see how our resource management initiatives have been effective.\nWe hope you'll find monitoring a key step to helping manage your own Snowflake spend.",[13,324,325,326,118],{},"Have any thoughts, questions, or suggestions? ",[57,327,330],{"href":328,"rel":329},"https://gitlab.com/gitlab-data/snowflake_spend/issues",[],"Create an issue",[13,332,333,334,339,340],{},"Photo by ",[57,335,338],{"href":336,"rel":337},"https://unsplash.com/photos/M5tzZtFCOfs",[],"Taylor Vick"," on ",[57,341,344],{"href":342,"rel":343},"https://unsplash.com/",[],"Unsplash",[346,347,348],"style",{},"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 .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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":133,"searchDepth":195,"depth":195,"links":350},[351,356,357],{"id":32,"depth":195,"text":33,"children":352},[353,354,355],{"id":48,"depth":211,"text":49},{"id":65,"depth":211,"text":66},{"id":81,"depth":211,"text":82},{"id":88,"depth":195,"text":89},{"id":103,"depth":195,"text":104},"open-source","2019-08-26","The GitLab data team is open sourcing the dbt package they use to manage their Snowflake spend.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670255/Blog/Hero%20Images/data-servers.jpg",{},true,"/en-us/blog/managing-your-snowflake-spend-with-periscope-and-dbt",{"title":5,"description":360,"ogTitle":5,"ogDescription":360,"noIndex":363,"ogImage":364,"ogUrl":369,"ogSiteName":370,"ogType":371,"canonicalUrls":369},"https://about.gitlab.com/blog/managing-your-snowflake-spend-with-periscope-and-dbt","https://about.gitlab.com","article","managing-your-snowflake-spend-with-periscope-and-dbt","en-us/blog/managing-your-snowflake-spend-with-periscope-and-dbt",[375,376,377,378],"collaboration","community","open source","releases","BlogPost","IsR_JDQElCV4H3ulK0cfwictoq1QLAOVqrXXSQWyQxc",{"logo":382,"freeTrial":387,"sales":392,"login":397,"items":402,"search":728,"minimal":759,"duo":778,"switchNav":787,"pricingDeployment":798},{"config":383},{"href":384,"dataGaName":385,"dataGaLocation":386},"/","gitlab logo","header",{"text":388,"config":389},"Get free trial",{"href":390,"dataGaName":391,"dataGaLocation":386},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":393,"config":394},"Request a demo",{"href":395,"dataGaName":396,"dataGaLocation":386},"/sales/?contact-topic=request-demo","sales",{"text":398,"config":399},"Sign in",{"href":400,"dataGaName":401,"dataGaLocation":386},"https://gitlab.com/users/sign_in/","sign in",[403,432,532,537,650,706],{"text":404,"config":405,"menu":407},"Platform",{"dataNavLevelOne":406},"platform",{"type":408,"columns":409},"cards",[410,416,424],{"title":404,"description":411,"link":412},"The intelligent orchestration platform for DevSecOps",{"text":413,"config":414},"Explore our Platform",{"href":415,"dataGaName":406,"dataGaLocation":386},"/platform/",{"title":417,"description":418,"link":419},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":420,"config":421},"Meet GitLab Duo",{"href":422,"dataGaName":423,"dataGaLocation":386},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":425,"description":426,"link":427},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":428,"config":429},"Learn more",{"href":430,"dataGaName":431,"dataGaLocation":386},"/why-gitlab/","why gitlab",{"text":433,"left":366,"config":434,"menu":436},"Product",{"dataNavLevelOne":435},"solutions",{"type":437,"link":438,"columns":442,"feature":511},"lists",{"text":439,"config":440},"View all Solutions",{"href":441,"dataGaName":435,"dataGaLocation":386},"/solutions/",[443,467,490],{"title":444,"description":445,"link":446,"items":451},"Automation","CI/CD and automation to accelerate deployment",{"config":447},{"icon":448,"href":449,"dataGaName":450,"dataGaLocation":386},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[452,456,459,463],{"text":453,"config":454},"CI/CD",{"href":455,"dataGaLocation":386,"dataGaName":453},"/solutions/continuous-integration/",{"text":417,"config":457},{"href":422,"dataGaLocation":386,"dataGaName":458},"gitlab duo agent platform - product menu",{"text":460,"config":461},"Source Code Management",{"href":462,"dataGaLocation":386,"dataGaName":460},"/solutions/source-code-management/",{"text":464,"config":465},"Automated Software Delivery",{"href":449,"dataGaLocation":386,"dataGaName":466},"Automated software delivery",{"title":468,"description":469,"link":470,"items":475},"Security","Deliver code faster without compromising security",{"config":471},{"href":472,"dataGaName":473,"dataGaLocation":386,"icon":474},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[476,480,485],{"text":477,"config":478},"Application Security Testing",{"href":472,"dataGaName":479,"dataGaLocation":386},"Application security testing",{"text":481,"config":482},"Software Supply Chain Security",{"href":483,"dataGaLocation":386,"dataGaName":484},"/solutions/supply-chain/","Software supply chain security",{"text":486,"config":487},"Software Compliance",{"href":488,"dataGaName":489,"dataGaLocation":386},"/solutions/software-compliance/","software compliance",{"title":491,"link":492,"items":497},"Measurement",{"config":493},{"icon":494,"href":495,"dataGaName":496,"dataGaLocation":386},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[498,502,506],{"text":499,"config":500},"Visibility & Measurement",{"href":495,"dataGaLocation":386,"dataGaName":501},"Visibility and Measurement",{"text":503,"config":504},"Value Stream Management",{"href":505,"dataGaLocation":386,"dataGaName":503},"/solutions/value-stream-management/",{"text":507,"config":508},"Analytics & Insights",{"href":509,"dataGaLocation":386,"dataGaName":510},"/solutions/analytics-and-insights/","Analytics and insights",{"title":512,"type":437,"items":513},"GitLab for",[514,520,526],{"text":515,"config":516},"Enterprise",{"icon":517,"href":518,"dataGaLocation":386,"dataGaName":519},"Building","/enterprise/","enterprise",{"text":521,"config":522},"Small Business",{"icon":523,"href":524,"dataGaLocation":386,"dataGaName":525},"Work","/small-business/","small business",{"text":527,"config":528},"Public Sector",{"icon":529,"href":530,"dataGaLocation":386,"dataGaName":531},"Organization","/solutions/public-sector/","public sector",{"text":533,"config":534},"Pricing",{"href":535,"dataGaName":536,"dataGaLocation":386,"dataNavLevelOne":536},"/pricing/","pricing",{"text":538,"config":539,"menu":541},"Resources",{"dataNavLevelOne":540},"resources",{"type":437,"link":542,"columns":546,"feature":639},{"text":543,"config":544},"View all resources",{"href":545,"dataGaName":540,"dataGaLocation":386},"/resources/",[547,580,607],{"title":548,"items":549},"Getting started",[550,555,560,565,570,575],{"text":551,"config":552},"Install",{"href":553,"dataGaName":554,"dataGaLocation":386},"/install/","install",{"text":556,"config":557},"Quick start guides",{"href":558,"dataGaName":559,"dataGaLocation":386},"/get-started/","quick setup checklists",{"text":561,"config":562},"Learn",{"href":563,"dataGaLocation":386,"dataGaName":564},"https://university.gitlab.com/","learn",{"text":566,"config":567},"Product documentation",{"href":568,"dataGaName":569,"dataGaLocation":386},"https://docs.gitlab.com/","product documentation",{"text":571,"config":572},"Best practice videos",{"href":573,"dataGaName":574,"dataGaLocation":386},"/getting-started-videos/","best practice videos",{"text":576,"config":577},"Integrations",{"href":578,"dataGaName":579,"dataGaLocation":386},"/integrations/","integrations",{"title":581,"items":582},"Discover",[583,588,593,598,602],{"text":584,"config":585},"Customer success stories",{"href":586,"dataGaName":587,"dataGaLocation":386},"/customers/","customer success stories",{"text":589,"config":590},"Blog",{"href":591,"dataGaName":592,"dataGaLocation":386},"/blog/","blog",{"text":594,"config":595},"Demo Hub",{"href":596,"dataGaName":597,"dataGaLocation":386},"/demo-hub/","demo hub",{"text":599,"config":600},"The Source",{"href":601,"dataGaName":592,"dataGaLocation":386},"/the-source/",{"text":603,"config":604},"Remote",{"href":605,"dataGaName":606,"dataGaLocation":386},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":608,"items":609},"Connect",[610,615,620,624,629,634],{"text":611,"config":612},"GitLab Services",{"href":613,"dataGaName":614,"dataGaLocation":386},"/services/","services",{"text":616,"config":617},"Contribute",{"href":618,"dataGaName":619,"dataGaLocation":386},"https://contributors.gitlab.com","contribute",{"text":621,"config":622},"Community",{"href":623,"dataGaName":376,"dataGaLocation":386},"/community/",{"text":625,"config":626},"Forum",{"href":627,"dataGaName":628,"dataGaLocation":386},"https://forum.gitlab.com/","forum",{"text":630,"config":631},"Events",{"href":632,"dataGaName":633,"dataGaLocation":386},"/events/","events",{"text":635,"config":636},"Partners",{"href":637,"dataGaName":638,"dataGaLocation":386},"/partners/","partners",{"config":640,"title":643,"text":644,"link":645},{"background":641,"textColor":642},"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":646,"config":647},"Read the latest",{"href":648,"dataGaName":649,"dataGaLocation":386},"/whats-new/","whats new",{"text":651,"config":652,"menu":654},"Company",{"dataNavLevelOne":653},"company",{"type":437,"columns":655},[656],{"items":657},[658,663,669,671,676,681,686,691,696,701],{"text":659,"config":660},"About",{"href":661,"dataGaName":662,"dataGaLocation":386},"/company/","about",{"text":664,"config":665,"footerGa":668},"Jobs",{"href":666,"dataGaName":667,"dataGaLocation":386},"/jobs/","jobs",{"dataGaName":667},{"text":630,"config":670},{"href":632,"dataGaName":633,"dataGaLocation":386},{"text":672,"config":673},"Leadership",{"href":674,"dataGaName":675,"dataGaLocation":386},"/company/team/e-group/","leadership",{"text":677,"config":678},"Handbook",{"href":679,"dataGaName":680,"dataGaLocation":386},"https://handbook.gitlab.com/","handbook",{"text":682,"config":683},"Investor relations",{"href":684,"dataGaName":685,"dataGaLocation":386},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":687,"config":688},"Trust Center",{"href":689,"dataGaName":690,"dataGaLocation":386},"/security/","trust center",{"text":692,"config":693},"AI Transparency Center",{"href":694,"dataGaName":695,"dataGaLocation":386},"/ai-transparency-center/","ai transparency center",{"text":697,"config":698},"Newsletter",{"href":699,"dataGaName":700,"dataGaLocation":386},"/company/contact/#contact-forms","newsletter",{"text":702,"config":703},"Press",{"href":704,"dataGaName":705,"dataGaLocation":386},"/press/","press",{"text":707,"config":708,"menu":709},"Contact us",{"dataNavLevelOne":653},{"type":437,"columns":710},[711],{"items":712},[713,718,723],{"text":714,"config":715},"Talk to sales",{"href":716,"dataGaName":717,"dataGaLocation":386},"/sales/","talk to sales",{"text":719,"config":720},"Support portal",{"href":721,"dataGaName":722,"dataGaLocation":386},"https://support.gitlab.com/hc/en-us","support portal",{"text":724,"config":725},"Customer portal",{"href":726,"dataGaName":727,"dataGaLocation":386},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":729,"login":730,"suggestions":737},"Close",{"text":731,"link":732},"To search repositories and projects, login to",{"text":733,"config":734},"gitlab.com",{"href":400,"dataGaName":735,"dataGaLocation":736},"search login","search",{"text":738,"default":739},"Suggestions",[740,742,746,748,752,756],{"text":417,"config":741},{"href":422,"dataGaName":417,"dataGaLocation":736},{"text":743,"config":744},"Code Suggestions (AI)",{"href":745,"dataGaName":743,"dataGaLocation":736},"/solutions/code-suggestions/",{"text":453,"config":747},{"href":455,"dataGaName":453,"dataGaLocation":736},{"text":749,"config":750},"GitLab on AWS",{"href":751,"dataGaName":749,"dataGaLocation":736},"/partners/technology-partners/aws/",{"text":753,"config":754},"GitLab on Google Cloud",{"href":755,"dataGaName":753,"dataGaLocation":736},"/partners/technology-partners/google-cloud-platform/",{"text":757,"config":758},"Why GitLab?",{"href":430,"dataGaName":757,"dataGaLocation":736},{"freeTrial":760,"mobileIcon":765,"desktopIcon":770,"secondaryButton":773},{"text":761,"config":762},"Start free trial",{"href":763,"dataGaName":391,"dataGaLocation":764},"https://gitlab.com/-/trials/new/","nav",{"altText":766,"config":767},"Gitlab Icon",{"src":768,"dataGaName":769,"dataGaLocation":764},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":766,"config":771},{"src":772,"dataGaName":769,"dataGaLocation":764},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":774,"config":775},"Get Started",{"href":776,"dataGaName":777,"dataGaLocation":764},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":779,"mobileIcon":783,"desktopIcon":785},{"text":780,"config":781},"Learn more about GitLab Duo",{"href":422,"dataGaName":782,"dataGaLocation":764},"gitlab duo",{"altText":766,"config":784},{"src":768,"dataGaName":769,"dataGaLocation":764},{"altText":766,"config":786},{"src":772,"dataGaName":769,"dataGaLocation":764},{"button":788,"mobileIcon":793,"desktopIcon":795},{"text":789,"config":790},"/switch",{"href":791,"dataGaName":792,"dataGaLocation":764},"#contact","switch",{"altText":766,"config":794},{"src":768,"dataGaName":769,"dataGaLocation":764},{"altText":766,"config":796},{"src":797,"dataGaName":769,"dataGaLocation":764},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":799,"mobileIcon":804,"desktopIcon":806},{"text":800,"config":801},"Back to pricing",{"href":535,"dataGaName":802,"dataGaLocation":764,"icon":803},"back to pricing","GoBack",{"altText":766,"config":805},{"src":768,"dataGaName":769,"dataGaLocation":764},{"altText":766,"config":807},{"src":772,"dataGaName":769,"dataGaLocation":764},{"title":809,"titleMobile":810,"button":811,"config":816},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":428,"config":812},{"href":813,"dataGaName":814,"dataGaLocation":815},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":817,"disabled":363},"release",{"data":819},{"text":820,"source":821,"edit":827,"contribute":832,"config":837,"items":842,"minimal":1052},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":822,"config":823},"View page source",{"href":824,"dataGaName":825,"dataGaLocation":826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":828,"config":829},"Edit this page",{"href":830,"dataGaName":831,"dataGaLocation":826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":833,"config":834},"Please contribute",{"href":835,"dataGaName":836,"dataGaLocation":826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":838,"facebook":839,"youtube":840,"linkedin":841},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[843,890,944,988,1020],{"title":533,"links":844,"subMenu":859},[845,849,854],{"text":846,"config":847},"View plans",{"href":535,"dataGaName":848,"dataGaLocation":826},"view plans",{"text":850,"config":851},"Why Premium?",{"href":852,"dataGaName":853,"dataGaLocation":826},"/pricing/premium/","why premium",{"text":855,"config":856},"Why Ultimate?",{"href":857,"dataGaName":858,"dataGaLocation":826},"/pricing/ultimate/","why ultimate",[860],{"title":861,"links":862},"Contact Us",[863,866,868,870,875,880,885],{"text":864,"config":865},"Contact sales",{"href":716,"dataGaName":396,"dataGaLocation":826},{"text":719,"config":867},{"href":721,"dataGaName":722,"dataGaLocation":826},{"text":724,"config":869},{"href":726,"dataGaName":727,"dataGaLocation":826},{"text":871,"config":872},"Status",{"href":873,"dataGaName":874,"dataGaLocation":826},"https://status.gitlab.com/","status",{"text":876,"config":877},"Terms of use",{"href":878,"dataGaName":879,"dataGaLocation":826},"/terms/","terms of use",{"text":881,"config":882},"Privacy statement",{"href":883,"dataGaName":884,"dataGaLocation":826},"/privacy/","privacy statement",{"text":886,"config":887},"Cookie preferences",{"dataGaName":888,"dataGaLocation":826,"id":889,"isOneTrustButton":366},"cookie preferences","ot-sdk-btn",{"title":433,"links":891,"subMenu":900},[892,896],{"text":893,"config":894},"DevSecOps platform",{"href":415,"dataGaName":895,"dataGaLocation":826},"devsecops platform",{"text":897,"config":898},"AI-Assisted Development",{"href":422,"dataGaName":899,"dataGaLocation":826},"ai-assisted development",[901],{"title":902,"links":903},"Topics",[904,909,914,919,924,929,934,939],{"text":905,"config":906},"CICD",{"href":907,"dataGaName":908,"dataGaLocation":826},"/topics/ci-cd/","cicd",{"text":910,"config":911},"GitOps",{"href":912,"dataGaName":913,"dataGaLocation":826},"/topics/gitops/","gitops",{"text":915,"config":916},"DevOps",{"href":917,"dataGaName":918,"dataGaLocation":826},"/topics/devops/","devops",{"text":920,"config":921},"Version Control",{"href":922,"dataGaName":923,"dataGaLocation":826},"/topics/version-control/","version control",{"text":925,"config":926},"DevSecOps",{"href":927,"dataGaName":928,"dataGaLocation":826},"/topics/devsecops/","devsecops",{"text":930,"config":931},"Cloud Native",{"href":932,"dataGaName":933,"dataGaLocation":826},"/topics/cloud-native/","cloud native",{"text":935,"config":936},"AI for Coding",{"href":937,"dataGaName":938,"dataGaLocation":826},"/topics/devops/ai-for-coding/","ai for coding",{"text":940,"config":941},"Agentic AI",{"href":942,"dataGaName":943,"dataGaLocation":826},"/topics/agentic-ai/","agentic ai",{"title":945,"links":946},"Solutions",[947,949,951,956,960,963,967,970,972,975,978,983],{"text":477,"config":948},{"href":472,"dataGaName":477,"dataGaLocation":826},{"text":466,"config":950},{"href":449,"dataGaName":450,"dataGaLocation":826},{"text":952,"config":953},"Agile development",{"href":954,"dataGaName":955,"dataGaLocation":826},"/solutions/agile-delivery/","agile delivery",{"text":957,"config":958},"SCM",{"href":462,"dataGaName":959,"dataGaLocation":826},"source code management",{"text":905,"config":961},{"href":455,"dataGaName":962,"dataGaLocation":826},"continuous integration & delivery",{"text":964,"config":965},"Value stream management",{"href":505,"dataGaName":966,"dataGaLocation":826},"value stream management",{"text":910,"config":968},{"href":969,"dataGaName":913,"dataGaLocation":826},"/solutions/gitops/",{"text":515,"config":971},{"href":518,"dataGaName":519,"dataGaLocation":826},{"text":973,"config":974},"Small business",{"href":524,"dataGaName":525,"dataGaLocation":826},{"text":976,"config":977},"Public sector",{"href":530,"dataGaName":531,"dataGaLocation":826},{"text":979,"config":980},"Education",{"href":981,"dataGaName":982,"dataGaLocation":826},"/solutions/education/","education",{"text":984,"config":985},"Financial services",{"href":986,"dataGaName":987,"dataGaLocation":826},"/solutions/finance/","financial services",{"title":538,"links":989},[990,992,994,996,999,1001,1004,1006,1008,1010,1012,1014,1016,1018],{"text":551,"config":991},{"href":553,"dataGaName":554,"dataGaLocation":826},{"text":556,"config":993},{"href":558,"dataGaName":559,"dataGaLocation":826},{"text":561,"config":995},{"href":563,"dataGaName":564,"dataGaLocation":826},{"text":566,"config":997},{"href":568,"dataGaName":998,"dataGaLocation":826},"docs",{"text":589,"config":1000},{"href":591,"dataGaName":592,"dataGaLocation":826},{"text":1002,"config":1003},"What's new",{"href":648,"dataGaName":649,"dataGaLocation":826},{"text":584,"config":1005},{"href":586,"dataGaName":587,"dataGaLocation":826},{"text":603,"config":1007},{"href":605,"dataGaName":606,"dataGaLocation":826},{"text":611,"config":1009},{"href":613,"dataGaName":614,"dataGaLocation":826},{"text":616,"config":1011},{"href":618,"dataGaName":619,"dataGaLocation":826},{"text":621,"config":1013},{"href":623,"dataGaName":376,"dataGaLocation":826},{"text":625,"config":1015},{"href":627,"dataGaName":628,"dataGaLocation":826},{"text":630,"config":1017},{"href":632,"dataGaName":633,"dataGaLocation":826},{"text":635,"config":1019},{"href":637,"dataGaName":638,"dataGaLocation":826},{"title":651,"links":1021},[1022,1024,1026,1028,1030,1032,1036,1041,1043,1045,1047],{"text":659,"config":1023},{"href":661,"dataGaName":653,"dataGaLocation":826},{"text":664,"config":1025},{"href":666,"dataGaName":667,"dataGaLocation":826},{"text":672,"config":1027},{"href":674,"dataGaName":675,"dataGaLocation":826},{"text":677,"config":1029},{"href":679,"dataGaName":680,"dataGaLocation":826},{"text":682,"config":1031},{"href":684,"dataGaName":685,"dataGaLocation":826},{"text":1033,"config":1034},"Sustainability",{"href":1035,"dataGaName":1033,"dataGaLocation":826},"/sustainability/",{"text":1037,"config":1038},"Diversity, inclusion and belonging (DIB)",{"href":1039,"dataGaName":1040,"dataGaLocation":826},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":687,"config":1042},{"href":689,"dataGaName":690,"dataGaLocation":826},{"text":697,"config":1044},{"href":699,"dataGaName":700,"dataGaLocation":826},{"text":702,"config":1046},{"href":704,"dataGaName":705,"dataGaLocation":826},{"text":1048,"config":1049},"Modern Slavery Transparency Statement",{"href":1050,"dataGaName":1051,"dataGaLocation":826},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1053},[1054,1057,1060],{"text":1055,"config":1056},"Terms",{"href":878,"dataGaName":879,"dataGaLocation":826},{"text":1058,"config":1059},"Cookies",{"dataGaName":888,"dataGaLocation":826,"id":889,"isOneTrustButton":366},{"text":1061,"config":1062},"Privacy",{"href":883,"dataGaName":884,"dataGaLocation":826},[1064,1077],{"id":1065,"title":7,"body":362,"config":1066,"content":1068,"description":362,"extension":1071,"meta":1072,"navigation":366,"path":1073,"seo":1074,"stem":1075,"__hash__":1076},"blogAuthors/en-us/blog/authors/taylor-murphy.yml",{"template":1067},"BlogAuthor",{"name":7,"config":1069},{"headshot":133,"ctfId":1070},"tayloramurphy","yml",{},"/en-us/blog/authors/taylor-murphy",{},"en-us/blog/authors/taylor-murphy","D3XThg99mpDO0WsODZiG1vKj_dmM2XzpG5ZQ6NGLsZY",{"id":1078,"title":8,"body":362,"config":1079,"content":1080,"description":362,"extension":1071,"meta":1083,"navigation":366,"path":1084,"seo":1085,"stem":1086,"__hash__":1087},"blogAuthors/en-us/blog/authors/emilie-schario.yml",{"template":1067},{"name":8,"config":1081},{"headshot":133,"ctfId":1082},"emilie",{},"/en-us/blog/authors/emilie-schario",{},"en-us/blog/authors/emilie-schario","4-ZPfQB6E10OHAng94-eQjARUE57IZrw4G0upDIpWc4",[1089,1097,1105],{"title":1090,"description":1091,"heroImage":1092,"category":358,"date":1093,"authors":1094,"slug":1096,"externalUrl":362},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1095],"Toon Claes","whats-new-in-git-2-55-0",{"title":1098,"description":1099,"heroImage":1100,"category":358,"date":1101,"authors":1102,"slug":1104,"externalUrl":362},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1103],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1106,"description":1107,"heroImage":1108,"category":358,"date":1109,"authors":1110,"slug":1112,"externalUrl":362},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1111],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1114},[1115,1129,1141,1153],{"id":1116,"categories":1117,"header":1119,"text":1120,"button":1121,"image":1126},"ai-modernization",[1118],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1122,"config":1123},"Get your AI maturity score",{"href":1124,"dataGaName":1125,"dataGaLocation":592},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1127},{"src":1128},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1130,"categories":1131,"header":1133,"text":1120,"button":1134,"image":1138},"devops-modernization",[1132,928],"product","Are you just managing tools or shipping innovation?",{"text":1135,"config":1136},"Get your DevOps maturity score",{"href":1137,"dataGaName":1125,"dataGaLocation":592},"/assessments/devops-modernization-assessment/",{"config":1139},{"src":1140},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1142,"categories":1143,"header":1145,"text":1120,"button":1146,"image":1150},"security-modernization",[1144],"security","Are you trading speed for security?",{"text":1147,"config":1148},"Get your security maturity score",{"href":1149,"dataGaName":1125,"dataGaLocation":592},"/assessments/security-modernization-assessment/",{"config":1151},{"src":1152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1154,"paths":1155,"header":1158,"text":1159,"button":1160,"image":1165},"github-azure-migration",[1156,1157],"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":1161,"config":1162},"See how GitLab compares to GitHub",{"href":1163,"dataGaName":1164,"dataGaLocation":592},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1166},{"src":1140},{"header":1168,"blurb":1169,"button":1170,"secondaryButton":1175},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1171,"config":1172},"Get your free trial",{"href":1173,"dataGaName":391,"dataGaLocation":1174},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":864,"config":1176},{"href":716,"dataGaName":396,"dataGaLocation":1174},1786803753076]