{"id":22597,"date":"2018-09-11T12:15:17","date_gmt":"2018-09-11T09:15:17","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=22597"},"modified":"2018-09-08T01:52:08","modified_gmt":"2018-09-07T22:52:08","slug":"monolithic-repos-are-evil","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/","title":{"rendered":"Monolithic Repos Are Evil"},"content":{"rendered":"<p>We all keep our code in <del>Git <\/del><a href=\"https:\/\/en.wikipedia.org\/wiki\/Version_control\">version control<\/a> repositories. The question is whether we should create a new repository for each new module or try to keep as much as possible in a single so called &#8220;monolithic&#8221; repo. Market leaders, like <a href=\"https:\/\/code.fb.com\/core-data\/scaling-mercurial-at-facebook\/\">Facebook<\/a> and <a href=\"https:\/\/www.infoq.com\/presentations\/Development-at-Google\">Google<\/a>, advocate the second approach. I believe they are wrong.<\/p>\n<p>Let&#8217;s use the following JavaScript function as an example. It downloads a JSON document from a <a href=\"http:\/\/www.zold.io\">Zold<\/a> node (using <a href=\"https:\/\/jquery.com\/\">jQuery<\/a>) and places part of its content on the HTML page. Then it colors the data according to its value.<\/p>\n<pre class=\"brush:java\">\/\/ main.js\r\nfunction main() {\r\n  $.getJSON('http:\/\/b1.zold.io\/', function(json) {\r\n    var $body = $('body');\r\n    $body.text(json.nscore);\r\n    var color = 'red';\r\n    if (json.nscore &gt; 500) {\r\n      color = 'green';\r\n    }\r\n    $body.css('color', color);\r\n  });\r\n}<\/pre>\n<p>Pretty obvious, isn&#8217;t it? Just a single <code>main.js<\/code> file which does everything we need. We simply add it to the HTML and it works:<\/p>\n<pre class=\"brush:html\">&lt;html&gt;\r\n  &lt;head&gt;\r\n    &lt;script src=\"https:\/\/code.jquery.com\/jquery-3.3.1.min.js\"\/&gt;\r\n    &lt;script src=\"main.js\"\/&gt;\r\n  &lt;\/head&gt;\r\n  &lt;body onload=\"main();\"&gt;loading...&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Now, let me refactor it. Let me break it into two pieces. The first piece will load the data and the second one will be a jQuery plugin to colorize HTML content according to the data it contains. This is how the plugin will look:<\/p>\n<pre class=\"brush:java\">\/\/ colorize.js\r\n$.fn.colorize = function() {\r\n  var data = parseFloat(this.text());\r\n  var keys = Object.keys(colors)\r\n    .map(function (k) { return parseInt(k); })\r\n    .sort(function (a,b) { return a - b; })\r\n    .reverse();\r\n  for (i = 0; i &lt; keys.length; ++i) {\r\n    var max = keys[i];\r\n    if (data &gt;= max) {\r\n      this.addClass(colors[max]);\r\n      return;\r\n    }\r\n    this.removeClass(colors[max]);\r\n  }\r\n  return this;\r\n}<\/pre>\n<p>The <code>main.js<\/code> will look like this:<\/p>\n<pre class=\"brush:java\">\/\/ main.js\r\nfunction main() {\r\n  $.getJSON('http:\/\/b1.zold.io\/', function(json) {\r\n    $('body')\r\n      .text(json.nscore)\r\n      .colorize({ 500: 'green', 0: 'red' });\r\n  });\r\n}<\/pre>\n<p>Now, instead of a single monolithic piece of code, we have two smaller pieces which have to be loaded together into the target HTML:<\/p>\n<pre class=\"brush:html\">&lt;html&gt;\r\n  &lt;head&gt;\r\n    &lt;script src=\"https:\/\/code.jquery.com\/jquery-3.3.1.min.js\"\/&gt;\r\n    &lt;script src=\"colorize.js\"\/&gt;\r\n    &lt;script src=\"main.js\"\/&gt;\r\n  &lt;\/head&gt;\r\n  &lt;body onload=\"main();\"&gt;loading...&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Two pieces are better than one? It seems that <a href=\"https:\/\/ai.google\/research\/pubs\/pub45424\">Google<\/a>, <a href=\"https:\/\/blog.digitalocean.com\/taming-your-go-dependencies\/\">Digital Ocean<\/a> and <a href=\"https:\/\/gregoryszorc.com\/blog\/2014\/09\/09\/on-monolithic-repositories\/\">Mozilla<\/a> don&#8217;t think so.<\/p>\n<p>I disagree.<\/p>\n<p>To illustrate my point I extracted the JavaScript function into a new standalone <a href=\"https:\/\/github.com\/yegor256\/colorizejs\">jQuery plugin<\/a>. Here is what I did:<\/p>\n<ul>\n<li>Created a new GitHub repo <a href=\"https:\/\/github.com\/yegor256\/colorizejs\">yegor256\/colorizejs<\/a>;<\/li>\n<li>Read the <a href=\"https:\/\/learn.jquery.com\/plugins\/basic-plugin-creation\/\">instructions<\/a>;<\/li>\n<li>Did some research of jQuery plugins, studied a few examples;<\/li>\n<li>Found out that most of them used <a href=\"https:\/\/gulpjs.com\/\">Gulp<\/a>, which I&#8217;ve never heard of;<\/li>\n<li>Decided to use <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a> for JavaScript packaging (what else, right?);<\/li>\n<li>Created <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/package.json\"><code>package.json<\/code><\/a> for npm;<\/li>\n<li>Renamed GitHub repo to <code>colorizejs<\/code> when I found out that npm package <a href=\"https:\/\/www.npmjs.com\/package\/colorize\"><code>colorize<\/code><\/a> already exists;<\/li>\n<li>Configured <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/.travis.yml\"><code>.travis.yml<\/code><\/a> for <a href=\"https:\/\/travis-ci.org\/\">Travis<\/a>;<\/li>\n<li>Created a <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/README.md\">README.md<\/a> and explained how to use it and install it;<\/li>\n<li>Decided to use the MIT license and created <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/LICENSE.txt\">LICENSE.txt<\/a>;<\/li>\n<li>Configured <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/.pdd\">PDD<\/a> for <a href=\"\/2017\/04\/05\/pdd-in-action.html\">puzzles<\/a> automated collection;<\/li>\n<li>Configured <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/blob\/master\/.rultor.yml\"><code>.rultor.yml<\/code><\/a> for <a href=\"\/2014\/07\/24\/rultor-automated-merging.html\">Rultor<\/a>;<\/li>\n<li>Tried to create a unit test and failed miserably (after a full hour of research), since I&#8217;ve had almost no experience in JS unit testing;<\/li>\n<li>Posted a <a href=\"https:\/\/stackoverflow.com\/questions\/51809750\/\">question<\/a> to StackOverflow;<\/li>\n<li>The question was answered by a few people only after the bounty I offered;<\/li>\n<li><a href=\"https:\/\/github.com\/brian-lives-outdoors\">@brian-lives-outdoors<\/a>&#8216;s answer was the best and he even submitted a <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/pull\/2\">pull request<\/a> with a unit test, which I merged;<\/li>\n<li>Released the first version <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/tree\/0.0.1\">0.0.1<\/a> to <a href=\"https:\/\/www.npmjs.com\/package\/colorizejs\">npmjs.com<\/a>;<\/li>\n<li>Modified the code to make it work both with classes and colors;<\/li>\n<li><a href=\"https:\/\/github.com\/yegor256\/colorizejs\/issues\/3\">Implemented<\/a> and released the next version <a href=\"https:\/\/github.com\/yegor256\/colorizejs\/tree\/0.1.0\">0.1.0<\/a>;<\/li>\n<li><a href=\"https:\/\/github.com\/zold-io\/zold.github.io\/issues\/81\">Added it<\/a> to Zold front-end, tested it, and released it&#8212;check it out <a href=\"http:\/\/www.zold.io\/health.html\">here<\/a>.<\/li>\n<\/ul>\n<p>It took almost three weeks of waiting and four hours of work, just to move a small piece of JavaScript code to a new repository and release it separately. Was it worth it? Well, I think it was. But <del>many<\/del> most other blog post authors, who I managed to find, think that it would be better to keep everything in a single monolithic repo, mostly because it&#8217;s better for <em>productivity<\/em>. For example, <a href=\"https:\/\/danluu.com\/monorepo\/\">Advantages of monorepos<\/a> by <a href=\"https:\/\/twitter.com\/danluu\">Dan Luu<\/a>, <a href=\"https:\/\/people.engr.ncsu.edu\/ermurph3\/papers\/seip18.pdf\">Advantages and Disadvantages of a Monolithic Repository<\/a> (a case study at Google) by Ciera Jaspan et al., and <a href=\"https:\/\/www.tomasvotruba.cz\/blog\/2017\/01\/31\/how-monolithic-repository-in-open-source-saved-my-laziness\/\">How Monolithic Repository in Open Source saved my Laziness<\/a> by Tomas Votruba.<\/p>\n<p>There are also a few good analyses of both approaches, for example <a href=\"https:\/\/www.dotconferences.com\/2016\/05\/fabien-potencier-monolithic-repositories-vs-many-repositories\">Monolithic repositories vs. Many repositories<\/a> speech by Fabien Potencier at dotScale 2016 and <a href=\"http:\/\/www.gigamonkeys.com\/mono-vs-multi\/\">Repo Style Wars: Mono vs Multi<\/a> by Peter Seibel.<\/p>\n<p>In a nutshell, they all claim that productivity is higher with a monolithic repo because the amount of operations one has to do in order to make a change is smaller. Indeed, in a monorepo there will be a single branch, a single set of commits, a single pull request, a single merge, deploy and release. Also it will be easier to test, both manually and via unit testing. Continuous integration is easier to configure, and so on and so forth.<\/p>\n<p>All these &#8220;reasonable&#8221; arguments remind me of what I hear when preaching object decomposition and suggesting that multiple objects are better than a single large one. Imagine a large class of 3,000 lines of code, which does many things and they are all very tightly coupled. It&#8217;s &#8220;easy&#8221; to test it, to make changes, to deploy, to review, etc. Because everything stays in one file, right? We don&#8217;t need to jump from class to class in order to understand the design. We just look at one screen, scroll it up and down, and that&#8217;s it. Right? Totally wrong!<\/p>\n<p>I guess I don&#8217;t need to explain why it&#8217;s wrong. We don&#8217;t design our software that way anymore. We know that tight coupling is a bad idea. We know that a set of smaller components is better than a larger solid piece.<\/p>\n<p>Why can&#8217;t we apply the same logic to repositories? I believe we can. Of course, just like in object-oriented programming, a fine-grained design requires more skills and time. Look at what I had to do with this small jQuery plugin. I&#8217;ve spent hours of coding and thinking. I even had to learn <a href=\"https:\/\/gulpjs.com\/\">Gulp<\/a> and <a href=\"https:\/\/jasmine.github.io\/\">Jasmine<\/a>, which I most probably will not use anymore. But the benefits we are getting from it are enormous. This is my short list of them:<\/p>\n<ul>\n<li><strong>Encapsulation<\/strong>. Each repo encapsulates a single problem, hiding its details from everybody else. Thanks to that, the scope each repo has to deal with gets smaller. The smaller the scope, just like in OOP, the easier it is to maintain and modify. The easier to maintain, the cheaper the development. I guess Google guys don&#8217;t really worry about costs. On the contrary, they want their salaries to grow. A large unmaintainable monolithic repo is a perfect tool to make it happen.<\/li>\n<li><strong>Fast Builds<\/strong>. When a repo is small, the time its automated build takes is small. Look at the time Travis <a href=\"https:\/\/travis-ci.org\/yegor256\/colorizejs\/builds\/420726284\">spends<\/a> for my jQuery plugin. It&#8217;s 51 seconds. It&#8217;s fast. We <a href=\"https:\/\/mortoray.com\/2015\/05\/06\/fast-build-turnaround-time-is-essential\/\">all know<\/a> that the faster the build, the better it is for productivity, since it&#8217;s easier to use the build as a tool for development.<\/li>\n<li><strong>Accurate Metrics<\/strong>. I don&#8217;t know whether you rely on metrics in your projects, but we at <a href=\"https:\/\/www.zerocracy.com\">Zerocracy<\/a> do pay attention to numbers, like lines of code, hits of code, number of commits, classes, methods, cohesion, coupling, etc. It&#8217;s always a question whether the metrics are accurate. Calculating lines of code for a large repository doesn&#8217;t make any sense, since the number will include a lot of files from completely different parts of the application. Moreover there will be different languages and file formats. Say a repo has 200K lines of Java, 150K lines of XML, 50K lines of JavaScript, and 40K lines of Ruby. Can you say something specific about this repo? Is it large? Is it a Java repo? And, more importantly, can it be compared with other repositories? Not really. It&#8217;s just a big messy storage of files.<\/li>\n<li><strong>Homogeneous Tasks<\/strong>. Smaller repositories tend to have smaller tech stacks, meaning that each of them uses just a few languages and frameworks, or (and this is the preferred situation)&#8212;one language or technology per repository. Thanks to this, the management of programmers becomes easier, since any ticket\/problem can be assigned to anybody. It&#8217;s easier to make tasks similar in size and complexity. This obviously means better manageability of the project.<\/li>\n<li><strong>Single Coding Standard<\/strong>. It&#8217;s easier to standardize the coding style if the repo is small. When it&#8217;s large, various parts of the code base will have different styles and it will be almost impossible to put everybody on the same page. In other words, smaller repositories look more beautiful than larger ones.<\/li>\n<li><strong>Short Names<\/strong>. Each repository, inevitably, will have its own namespace. For example, in the JS repository I just created, I only have two files: <code>colorizejs.js<\/code> and <code>test-colorizejs.js<\/code>. I don&#8217;t really care about the naming inside them, since the namespace is very small. <del>I can even use global variables.<\/del> Shorter names and smaller namespaces mean better maintainability.<\/li>\n<li><strong>Simple Tests<\/strong>. The larger the code base, the more dependencies it has, which are difficult to mock and test. Very large code bases become fundamentally untestable since they require a lot of integration tests which are difficult to maintain. Smaller libraries, frameworks and modules are easier to keep at the level of simple and fast unit testing.<\/li>\n<\/ul>\n<p>Thus, I believe that the smaller the repositories and modules, the better. Ideally, I would say, the largest acceptable size for a code base is 50,000 lines of code. Everything that goes above this line is a perfect candidate for decomposition.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>Published on Web Code Geeks with permission by Yegor Bugayenko, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/www.yegor256.com\/2018\/09\/05\/monolithic-repositories.html\" target=\"_blank\" rel=\"noopener\">Monolithic Repos Are Evil<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>We all keep our code in Git version control repositories. The question is whether we should create a new repository for each new module or try to keep as much as possible in a single so called &#8220;monolithic&#8221; repo. Market leaders, like Facebook and Google, advocate the second approach. I believe they are wrong. Let&#8217;s &hellip;<\/p>\n","protected":false},"author":6534,"featured_media":920,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[452,416,63,40],"class_list":["post-22597","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-git","tag-html","tag-jquery-2","tag-json"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Monolithic Repos Are Evil - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monolithic Repos Are Evil - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/yegor256\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-11T09:15:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Yegor Bugayenko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@yegor256\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yegor Bugayenko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\"},\"author\":{\"name\":\"Yegor Bugayenko\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/96538e7abaac9f7a3dce9d5d92e1cb33\"},\"headline\":\"Monolithic Repos Are Evil\",\"datePublished\":\"2018-09-11T09:15:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\"},\"wordCount\":1480,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"keywords\":[\"Git\",\"HTML\",\"JQuery\",\"JSON\"],\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\",\"name\":\"Monolithic Repos Are Evil - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"datePublished\":\"2018-09-11T09:15:17+00:00\",\"description\":\"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Monolithic Repos Are Evil\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/96538e7abaac9f7a3dce9d5d92e1cb33\",\"name\":\"Yegor Bugayenko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c3696c78da79ebdd9ffa8e87e8832461b7cd59659483373b34da4ae25dfb573a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c3696c78da79ebdd9ffa8e87e8832461b7cd59659483373b34da4ae25dfb573a?s=96&d=mm&r=g\",\"caption\":\"Yegor Bugayenko\"},\"description\":\"Yegor Bugayenko is an Oracle certified Java architect, CEO of Zerocracy, author of Elegant Objects book series about object-oriented programing, lead architect and founder of Cactoos, Takes, Rultor and Jcabi, and a big fan of test automation.\",\"sameAs\":[\"http:\/\/www.yegor256.com\/\",\"https:\/\/www.facebook.com\/yegor256\",\"https:\/\/www.linkedin.com\/in\/yegor256\",\"https:\/\/x.com\/yegor256\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/yegor-bugayenko\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Monolithic Repos Are Evil - Web Code Geeks - 2026","description":"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/","og_locale":"en_US","og_type":"article","og_title":"Monolithic Repos Are Evil - Web Code Geeks - 2026","og_description":"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_author":"https:\/\/www.facebook.com\/yegor256","article_published_time":"2018-09-11T09:15:17+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","type":"image\/jpeg"}],"author":"Yegor Bugayenko","twitter_card":"summary_large_image","twitter_creator":"@yegor256","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Yegor Bugayenko","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/"},"author":{"name":"Yegor Bugayenko","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/96538e7abaac9f7a3dce9d5d92e1cb33"},"headline":"Monolithic Repos Are Evil","datePublished":"2018-09-11T09:15:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/"},"wordCount":1480,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","keywords":["Git","HTML","JQuery","JSON"],"articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/","name":"Monolithic Repos Are Evil - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","datePublished":"2018-09-11T09:15:17+00:00","description":"Interested to learn more about monolithic repos? Check out our article where we talk about monolithic repos and why they should be avoided!","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/monolithic-repos-are-evil\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Monolithic Repos Are Evil"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/96538e7abaac9f7a3dce9d5d92e1cb33","name":"Yegor Bugayenko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c3696c78da79ebdd9ffa8e87e8832461b7cd59659483373b34da4ae25dfb573a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c3696c78da79ebdd9ffa8e87e8832461b7cd59659483373b34da4ae25dfb573a?s=96&d=mm&r=g","caption":"Yegor Bugayenko"},"description":"Yegor Bugayenko is an Oracle certified Java architect, CEO of Zerocracy, author of Elegant Objects book series about object-oriented programing, lead architect and founder of Cactoos, Takes, Rultor and Jcabi, and a big fan of test automation.","sameAs":["http:\/\/www.yegor256.com\/","https:\/\/www.facebook.com\/yegor256","https:\/\/www.linkedin.com\/in\/yegor256","https:\/\/x.com\/yegor256"],"url":"https:\/\/www.webcodegeeks.com\/author\/yegor-bugayenko\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/22597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/6534"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=22597"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/22597\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/920"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=22597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=22597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=22597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}