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 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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>Support open source that you use by paying the maintainers to talk to your team (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://simonwillison.net/2022/Feb/23/support-open-source/">
  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>Support open source that you use by paying the maintainers to talk to your team</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://simonwillison.net/2022/Feb/23/support-open-source/" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <h2>Support open source that you use by paying the maintainers to talk to your team</h2>
  71. <p>I think I’ve come up with a novel hack for the challenge of getting your company to financially support the open source projects that it uses: reach out to the maintainers and <em>offer them generous speaking fees</em> for remote talks to your engineering team.</p>
  72. <h4>The problem</h4>
  73. <p>Everyone agrees that open source projects deserve more financial support. Actually supporting projects can be surprisingly difficult though:</p>
  74. <ul>
  75. <li>Many projects don’t offer any clear mechanism for sponsoring them.</li>
  76. <li>More to the point: open source projects are often really bad at asking for or thinking about money—it’s rarely a core competency!</li>
  77. <li>Projects that do often get the tiers wrong: a $5/month “buy a coffee” GitHub sponsorship isn’t really going to make a meaningful impact on a project.</li>
  78. <li>But… making the case that a for-profit company should hand over money for something they’re getting for free is hard! You need a lot of buy-in from a lot of stakeholders for anything involving spending money—and many of the people who care about this within a company won’t have enough internal clout to get it to happen.</li>
  79. </ul>
  80. <p>If you can make sponsorship happen, great: you should do that. But if not… how about reaching out to the maintainers and offering to hire them for an hour-long “consultancy” speaking engagement instead?</p>
  81. <p>Thanks to the rise of remote working and Zoom, giving a talk no longer requires traveling to a venue—which could easily turn an hour-long opportunity into a full day.</p>
  82. <p>One-off paid speaking opportunities are much more likely to fit into a regular company’s model of how money should spent than monthly donations.</p>
  83. <h4>What if they’re not experienced speakers?</h4>
  84. <p>The obvious flaw in this idea is that being an open source maintainer doesn’t necessarily mean that someone is a great public speaker: speaking is a skill unto itself.</p>
  85. <p>If that’s the case, I propose running the session as a moderated Q&amp;A instead.</p>
  86. <p>Find a member of your team with speaking experience to act as a host. Gather questions from your other engineers in advance, and share them with your guest so that they can prepare. Then run the session as a Q&amp;A.</p>
  87. <p>This takes a huge deal of pressure off the speaker, and means you get a conversation that’s much more targeted to your team’s interests and needs as well.</p>
  88. <h4>So go and do it!</h4>
  89. <p>Remember, the key problem we’re trying to solve here is how to financially support projects and maintainers that may not be very good at asking for the money.</p>
  90. <p>I want to take the pressure off those maintainers to learn how to market and sell their services.</p>
  91. <p>So reach out to some projects you use and ask them if you can pay them to spend an hour of their time talking to your team! I’m excited to see how well this works.</p>
  92. <p><strong>Be generous</strong>: This isn’t about negotiating the best speaking rate from someone who may never have been paid to speak before. This is about compensating them for the enormous value that your company has gained from their work, and using a clever accounting trick to do so. So offer them a generous fee up front! Paying over the odds should be part of your goal here.</p>
  93. <p>For larger companies there’s probably an upper cap on the amount that can be expensed easily. Finding out what that is might be helpful here too.</p>
  94. <p>Your company likely has an existing education budget which might be a good source of funds for this kind of engagement.</p>
  95. <p>(If your team would benefit from a talk from me about <a href="https://datasette.io/">Datasette</a>, <a href="https://sqlite-utils.datasette.io/">sqlite-utils</a>, <a href="https://simonwillison.net/2020/Oct/9/git-scraping/">Git scraping</a> or any of the other projects I have going on, please drop me a line at <code>swillison at gmail dot com</code>. You can also <a href="https://github.com/sponsors/simonw">sponsor my work on GitHub</a>!)</p>
  96. <p>This post is being <a href="https://news.ycombinator.com/item?id=30446039">discussed on Hacker News</a>.</p>
  97. </article>
  98. <hr>
  99. <footer>
  100. <p>
  101. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  102. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  103. </svg> Accueil</a> •
  104. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  105. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  106. </svg> Suivre</a> •
  107. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  108. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  109. </svg> Pro</a> •
  110. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  111. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  112. </svg> Email</a> •
  113. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  114. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  115. </svg> Légal</abbr>
  116. </p>
  117. <template id="theme-selector">
  118. <form>
  119. <fieldset>
  120. <legend><svg class="icon icon-brightness-contrast">
  121. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  122. </svg> Thème</legend>
  123. <label>
  124. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  125. </label>
  126. <label>
  127. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  128. </label>
  129. <label>
  130. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  131. </label>
  132. </fieldset>
  133. </form>
  134. </template>
  135. </footer>
  136. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  137. <script>
  138. function loadThemeForm(templateName) {
  139. const themeSelectorTemplate = document.querySelector(templateName)
  140. const form = themeSelectorTemplate.content.firstElementChild
  141. themeSelectorTemplate.replaceWith(form)
  142. form.addEventListener('change', (e) => {
  143. const chosenColorScheme = e.target.value
  144. localStorage.setItem('theme', chosenColorScheme)
  145. toggleTheme(chosenColorScheme)
  146. })
  147. const selectedTheme = localStorage.getItem('theme')
  148. if (selectedTheme && selectedTheme !== 'undefined') {
  149. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  150. }
  151. }
  152. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  153. window.addEventListener('load', () => {
  154. let hasDarkRules = false
  155. for (const styleSheet of Array.from(document.styleSheets)) {
  156. let mediaRules = []
  157. for (const cssRule of styleSheet.cssRules) {
  158. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  159. continue
  160. }
  161. // WARNING: Safari does not have/supports `conditionText`.
  162. if (cssRule.conditionText) {
  163. if (cssRule.conditionText !== prefersColorSchemeDark) {
  164. continue
  165. }
  166. } else {
  167. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  168. continue
  169. }
  170. }
  171. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  172. }
  173. // WARNING: do not try to insert a Rule to a styleSheet you are
  174. // currently iterating on, otherwise the browser will be stuck
  175. // in a infinite loop…
  176. for (const mediaRule of mediaRules) {
  177. styleSheet.insertRule(mediaRule.cssText)
  178. hasDarkRules = true
  179. }
  180. }
  181. if (hasDarkRules) {
  182. loadThemeForm('#theme-selector')
  183. }
  184. })
  185. </script>
  186. </body>
  187. </html>