{"id":79510,"date":"2026-04-25T22:37:28","date_gmt":"2026-04-25T22:37:28","guid":{"rendered":"https:\/\/owncloud.com\/?p=79510"},"modified":"2026-04-25T22:37:28","modified_gmt":"2026-04-25T22:37:28","slug":"what-108-repositories-taught-us-about-open-source-hygiene","status":"publish","type":"post","link":"https:\/\/owncloud.com\/de\/blogs\/what-108-repositories-taught-us-about-open-source-hygiene\/","title":{"rendered":"What 108 repositories taught us about open source hygiene"},"content":{"rendered":"<p>The ownCloud GitHub organization has 108 public, non-archived repositories.<br \/>\nI know, because I mapped every single one last week.<\/p>\n<p>When you&#8217;ve been building open source since 2010, sixteen years (!), your GitHub org becomes an archaeological dig:<\/p>\n<ul>\n<li>Active projects, next to repos untouched since 2017.<\/li>\n<li>Experimental forks from five years ago in search results.<\/li>\n<\/ul>\n<p>The first thing a potential contributor sees is confusion. So, we mapped it.<br \/>\nEvery repo categorized into six groups:<\/p>\n<ul>\n<li>oCIS (15 repos),<\/li>\n<li>Classic (40 repos),<\/li>\n<li>Clients (15 repos),<\/li>\n<li>Documentation (10 repos),<\/li>\n<li>LibreGraph API (5 repos), and Infrastructure (23 repos).<\/li>\n<\/ul>\n<p>The map is going into the GitHub org profile README.<\/p>\n<p>What we found:<\/p>\n<ul>\n<li>Seven repos are forks of upstream project;<br \/>\nThese carry the upstream license and can&#8217;t be relicensed. We&#8217;re tagging them clearly.<\/li>\n<li>Several repos haven&#8217;t been pushed to in over two years.<br \/>\nWe&#8217;re reviewing each one:<\/p>\n<ul>\n<li>archive the dead ones (moved to ownCloud-archive),<\/li>\n<li>mark the stable ones clearly.<\/li>\n<\/ul>\n<\/li>\n<li>Ten documentation repos:<br \/>\ndocs is the Antora framework that ties them together, with per-product repos underneath, but if you didn&#8217;t know that, you&#8217;d have no idea where to contribute a docs fix. Now it&#8217;s in the map.<\/li>\n<\/ul>\n<p>We&#8217;re setting up a\u00a0<strong>.<\/strong>github repo with org-wide defaults:<\/p>\n<ul>\n<li>CONTRIBUTING.md,<\/li>\n<li>CODE_OF_CONDUCT.md,<\/li>\n<li>SECURITY.md,<\/li>\n<li>SUPPORT.md,<\/li>\n<li>and a PR template with a DCO sign-off reminder.<\/li>\n<\/ul>\n<p>One set of defaults instead of 108 copies.<\/p>\n<p>Repo hygiene might not be glamorous, but it&#8217;s the difference between a GitHub org that says &#8222;we&#8217;re serious&#8220; and one that says &#8222;we threw some code on the internet.&#8220;<\/p>\n<p>Tomorrow: I&#8217;m a script kid running an OSPO.<\/p>\n<p>&nbsp;<\/p>\n<p><em>This is part 3 of this blog post series. <\/em><br \/>\n<em>See the earlier posts:<\/em><\/p>\n<ol>\n<li><em><a href=\"https:\/\/owncloud.com\/blogs\/a-re-introduction-to-the-owncloud-community\/\">A (re)-introduction to the ownCloud community<\/a>.<\/em><\/li>\n<li><em><a href=\"https:\/\/owncloud.com\/blogs\/what-happens-when-you-fork-twice-get-acquired-and-keep-shipping-anyway\/\">What happens when you fork twice, get acquired, and keep shipping anyway<\/a><\/em><\/li>\n<li><em><a href=\"https:\/\/owncloud.com\/blogs\/we-killed-our-own-cla-heres-why-thats-a-good-thing\/\">We killed our own CLA. Here\u2019s why that\u2019s a good thing<\/a><\/em><\/li>\n<li><em><a href=\"https:\/\/owncloud.com\/blogs\/php-8-3-yes-for-classic-yes-we-heard-you\/\">PHP 8.3. Yes, for Classic. Yes, we heard you<\/a><\/em><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Sixteen years. 108 repos. One map. What an archaeological dig through the ownCloud GitHub org taught us about contributor experience and open source hygiene<\/p>\n","protected":false},"author":56,"featured_media":78665,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[333,344],"tags":[],"class_list":["post-79510","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-community","category-opensource"],"acf":[],"_links":{"self":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/users\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/comments?post=79510"}],"version-history":[{"count":4,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79510\/revisions"}],"predecessor-version":[{"id":79514,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79510\/revisions\/79514"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/media\/78665"}],"wp:attachment":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/media?parent=79510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/categories?post=79510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/tags?post=79510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}