A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>It is important for free software to use free software infrastructure (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Documented, feel free to shoot an email. -->
  28. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  29. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  36. <script>
  37. function toggleTheme(themeName) {
  38. document.documentElement.classList.toggle(
  39. 'forced-dark',
  40. themeName === 'dark'
  41. )
  42. document.documentElement.classList.toggle(
  43. 'forced-light',
  44. themeName === 'light'
  45. )
  46. }
  47. const selectedTheme = localStorage.getItem('theme')
  48. if (selectedTheme !== 'undefined') {
  49. toggleTheme(selectedTheme)
  50. }
  51. </script>
  52. <meta name="robots" content="noindex, nofollow">
  53. <meta content="origin-when-cross-origin" name="referrer">
  54. <!-- Canonical URL for SEO purposes -->
  55. <link rel="canonical" href="https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html">
  56. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  57. <article>
  58. <header>
  59. <h1>It is important for free software to use free software infrastructure</h1>
  60. </header>
  61. <nav>
  62. <p class="center">
  63. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  64. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  65. </svg> Accueil</a> •
  66. <a href="https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <p><em>Disclaimer: I founded a project and a company that focuses on free software
  71. infrastructure. I will elect not to name them in this post, and will only
  72. recommend solutions I do not have a vested interest in.</em></p>
  73. <p>Free and open source software (FOSS) projects need infrastructure. Somewhere to
  74. host the code, to facilitate things like code review, end-user support, bug
  75. tracking, marketing, and so on. A common example of this is the “forge”
  76. platform: infrastructure which pitches itself as a one-stop shop for many of the
  77. needs of FOSS projects in one place, such as code hosting and review, bug
  78. tracking, discussions, and so on. Many projects will also reach for additional
  79. platforms to provide other kinds of infrastructure: chat rooms, forums, social
  80. media, and more.</p>
  81. <p>Many of these needs have <abbr title="Projects which do not use a license compatible with the Free Software guidelines, i.e. non-FOSS.">non-free</abbr>,
  82. proprietary solutions available. GitHub is a popular proprietary code forge, and
  83. GitLab, the biggest competitor to GitHub, is partially non-free. Some projects
  84. use Discord or Slack for chat rooms, Reddit as a forum, or Twitter and Facebook
  85. for marketing, outreach, and support; all of these are non-free. In my opinion,
  86. relying on these platforms to provide infrastructure for your FOSS project is a
  87. mistake.</p>
  88. <p>When your FOSS project chooses to use a non-free platform, you give it an
  89. official vote of confidence on behalf of your project. In other words, you lend
  90. some of your project’s credibility and legitimacy to the platforms you choose.
  91. These platforms are defined by network effects, and your choice is an investment
  92. in that network. I would question this investment in and of itself, the wisdom
  93. of offering these platforms your confidence and legitimacy, but there’s a more
  94. concerning consequence of this choice as well: an investment in a non-free
  95. platform is also a <em>divestment</em> from the free alternatives.</p>
  96. <p>Again, network effects are the main driver of success in these platforms. Large
  97. commercial platforms have a lot of advantages in this respect: large marketing
  98. budgets, lots of capital from investors, and the incumbency advantage. The
  99. larger the incumbent platform, the more difficult the task of competing with it
  100. becomes. Contrast this with free software platforms, which generally don’t have
  101. the benefit of large amounts of investment or big marketing budgets. Moreover,
  102. businesses are significantly more likely to play dirty to secure their foothold
  103. than free software projects are. If your own FOSS projects compete with
  104. proprietary commercial options, you should be very familiar with these
  105. challenges.</p>
  106. <p>FOSS platforms are at an inherent disadvantage, and your faith in them, or lack
  107. thereof, carries a lot of weight. GitHub won’t lose sleep if your project
  108. chooses to host its code somewhere else, but choosing <a href="https://codeberg.org">Codeberg</a>, for example,
  109. means a lot to them. In effect, your choice matters disproportionately to the
  110. free platforms: choosing GitHub hurts Codeberg much more than choosing Codeberg
  111. hurts GitHub. And why should a project choose to use your offering over the
  112. proprietary alternatives if you won’t extend them the same courtesy? FOSS
  113. solidarity is important for uplifting the ecosystem as a whole.</p>
  114. <p>However, for some projects, what ultimately matters to them has little to do
  115. with the benefit of the ecosystem as a whole, but instead considers only the
  116. potential for their project’s individual growth and popularity. Many projects
  117. choose to prioritize access to the established audience that large commercial
  118. platforms provide, in order to maximize their odds of becoming popular, and
  119. enjoying some of the knock-on effects of that popularity, such as more
  120. contributions.<sup id="fnref:1"></sup> Such projects would prefer to exacerbate the network
  121. effects problem rather than risk some of its social capital on a less popular
  122. platform.</p>
  123. <p>To me, this is selfish and unethical outright, though you may have different
  124. ethical standards. Unfortunately, arguments against most commercial platforms
  125. for any reasonable ethical standard are available in abundance, but they tend to
  126. be easily overcome by confirmation bias. Someone who may loudly object to the
  127. practices of the US Immigration and Customs Enforcement agency, for example, can
  128. quickly find some justification to continue using GitHub despite their
  129. collaboration with them. If this example isn’t to your tastes, there are many
  130. examples for each of many platforms. For projects that don’t want to move, these
  131. are usually swept under the rug.<sup id="fnref:2"></sup></p>
  132. <p>But, to be clear, I am not asking you to use inferior platforms for
  133. philosophical or altruistic reasons. These are only one of many factors which
  134. should contribute to your decision-making, and aptitude is another valid factor
  135. to consider. That said, many FOSS platforms are, at least in my opinion,
  136. functionally superior to their proprietary competition. Whether their
  137. differences are better for your project’s unique needs is something I must leave
  138. for you to research on your own, but most projects don’t bother with the
  139. research at all. Rest assured: these projects are not ghettos living in the
  140. shadow of their larger commercial counterparts, but exciting platforms in their
  141. own right which offer many unique advantages.</p>
  142. <p>What’s more, if you need them to do something differently to better suit your
  143. project’s needs, you are empowered to improve them. You’re not subservient to
  144. the whims of the commercial entity who is responsible for the code, waiting for
  145. them to prioritize the issue or even to care about it in the first place. If a
  146. problem is important to you, that’s enough for you to get it fixed on a FOSS
  147. platform. You might not think you have the time or expertise to do so (though
  148. maybe one of your collaborators does), but more importantly, this establishes a
  149. mentality of collective ownership and responsibility over all free software as a
  150. whole — popularize this philosophy and it could just as easily be you
  151. receiving a contribution in a similar manner tomorrow.</p>
  152. <p>In short, choosing non-free platforms is an individualist, short-term investment
  153. which prioritizes your project’s apparent access to popularity over the success
  154. of the FOSS ecosystem as a whole. On the other hand, choosing FOSS platforms is
  155. a collectivist investment in the long-term success of the FOSS ecosystem as a
  156. whole, driving its overall growth. Your choice matters. You can help the FOSS
  157. ecosystem by choosing FOSS platforms, or you can hurt the FOSS ecosystem by
  158. choosing non-free platforms. Please choose carefully.</p>
  159. <p>Here are some recommendations for free software tools that facilitate common
  160. needs for free software projects:</p>
  161. <p>* Self-hosted only<br>
  162. † Partially non-free, recommended only if no other solutions are suitable</p>
  163. <p>P.S. If your project is already established on non-free platforms, the easiest
  164. time to revisit this choice is right now. It will only ever get more difficult
  165. to move as your project grows and gets further established on proprietary
  166. platforms. Please consider moving sooner rather than later.</p>
  167. </article>
  168. <hr>
  169. <footer>
  170. <p>
  171. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  172. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  173. </svg> Accueil</a> •
  174. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  175. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  176. </svg> Suivre</a> •
  177. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  178. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  179. </svg> Pro</a> •
  180. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  181. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  182. </svg> Email</a> •
  183. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  184. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  185. </svg> Légal</abbr>
  186. </p>
  187. <template id="theme-selector">
  188. <form>
  189. <fieldset>
  190. <legend><svg class="icon icon-brightness-contrast">
  191. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  192. </svg> Thème</legend>
  193. <label>
  194. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  195. </label>
  196. <label>
  197. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  198. </label>
  199. <label>
  200. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  201. </label>
  202. </fieldset>
  203. </form>
  204. </template>
  205. </footer>
  206. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  207. <script>
  208. function loadThemeForm(templateName) {
  209. const themeSelectorTemplate = document.querySelector(templateName)
  210. const form = themeSelectorTemplate.content.firstElementChild
  211. themeSelectorTemplate.replaceWith(form)
  212. form.addEventListener('change', (e) => {
  213. const chosenColorScheme = e.target.value
  214. localStorage.setItem('theme', chosenColorScheme)
  215. toggleTheme(chosenColorScheme)
  216. })
  217. const selectedTheme = localStorage.getItem('theme')
  218. if (selectedTheme && selectedTheme !== 'undefined') {
  219. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  220. }
  221. }
  222. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  223. window.addEventListener('load', () => {
  224. let hasDarkRules = false
  225. for (const styleSheet of Array.from(document.styleSheets)) {
  226. let mediaRules = []
  227. for (const cssRule of styleSheet.cssRules) {
  228. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  229. continue
  230. }
  231. // WARNING: Safari does not have/supports `conditionText`.
  232. if (cssRule.conditionText) {
  233. if (cssRule.conditionText !== prefersColorSchemeDark) {
  234. continue
  235. }
  236. } else {
  237. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  238. continue
  239. }
  240. }
  241. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  242. }
  243. // WARNING: do not try to insert a Rule to a styleSheet you are
  244. // currently iterating on, otherwise the browser will be stuck
  245. // in a infinite loop…
  246. for (const mediaRule of mediaRules) {
  247. styleSheet.insertRule(mediaRule.cssText)
  248. hasDarkRules = true
  249. }
  250. }
  251. if (hasDarkRules) {
  252. loadThemeForm('#theme-selector')
  253. }
  254. })
  255. </script>
  256. </body>
  257. </html>