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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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>Making Gemini Easy (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://proxy.vulpes.one/gemini/tilde.team/~tomasino/journal/20211103-making-gemini-easy.gmi">
  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>Making Gemini Easy</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://proxy.vulpes.one/gemini/tilde.team/~tomasino/journal/20211103-making-gemini-easy.gmi" title="Lien vers le contenu original">Source originale</a>
  67. </p>
  68. </nav>
  69. <hr>
  70. <div class="section"><p class="section__content">In both #gemini IRC channels (tilde.chat and libera.chat) I had different conversations lead me to explaining the same vision I have for a way to make gemspace much easier for non-technical people. I thought I should write it up here for posterity.</p></div>
  71. <p class="section"><span class="section__type"> ##</span><h2 class="section__content">Reading content</h2></p>
  72. <div class="section"><p class="section__content">First of all, reading gemini is already easy. The only barrier to entry is getting a gemini client. This is not a real barrier, though. People the world over are already familiar with downloading a program to work on a non-web thing. Take BitTorrent for example. Still too techy? How about literally any game?</p></div>
  73. <div class="section"><p class="section__content">We've also got proxies, but I don't think they're actually helping with the ease-of-use. They're a crutch preventing someone from the 2 minute task of "oh, let me download the app," which will have them connected going forward. Regardless, reading isn't hard and it's not the focus of my vision.</p></div>
  74. <p class="section"><span class="section__type"> ##</span><h2 class="section__content">Authoring content</h2></p>
  75. <div class="section"><p class="section__content">The more difficult task is authoring content. How do you pick a server? In this use case you are a non-technical user, so you're not looking for server software to install, but instead a host where you can put your content. There's not a good place to browse for that. Maybe you'll ask around, but where? You're not on the mailing list or in IRC. You'll probably ask whoever told you about gemini.</p></div>
  76. <div class="section"><p class="section__content">So you pick a place to have your presence. Now how do you get your own space? There's no "register" button on Gemini, right? Do you need to email someone? Did you stumble into the tildeverse? Now you're reading about making public and private keys and the command line. This can't be right. Gemini is supposed to be easy. Your friend told you that you just write text files and had a special caret thing for links. Why are we calling up a terminal now?</p></div>
  77. <div class="section"><p class="section__content">This is where things fall apart for many. In order to get them to use our very simple tool we have them jump through many non-simple hoops.</p></div>
  78. <div class="section"><p class="section__content">We're capable of making this process easier for people. So much of what it takes to add content to a gemini capsule is things we can automate. So why don't we?</p></div>
  79. <p class="section"><span class="section__type"> ##</span><h2 class="section__content">Making it easy</h2></p>
  80. <div class="section"><p class="section__content">Imagine a new client. This client is a little different. When you launch it you can browse gemini like all good little clients. But there's another option here. You go to File -&gt; New, and choose "Capsule". You are presented a list of servers available to join. Ahh, there, "GemJournal". That sounds cute, sorta like LiveJournal. You select it and it prompts you for your capsule name. I'll call this one "Artemis". That sounds cool. You are prompted to create a password. Enter it twice to double check. There we go.</p></div>
  81. <div class="section"><p class="section__content">What's this now? A little folder view on the side showing my capsule? I can click this button here to create a new gemlog, or maybe I'll just select one of these files and open it in the editor. Ahh, here's the gemtext that my friend was telling me about. I'll do a little doodle here. Maybe an ascii art bow as the symbol of Artemis. File -&gt; Save and... oh, it's published! I can click this link to jump right to the... oh wow, look what I made!</p></div>
  82. <p class="section"><span class="section__type"> ##</span><h2 class="section__content">Automate away the crud</h2></p>
  83. <div class="section"><p class="section__content">That experience I just described is something we're capable of making right now. Someone grab the source code to Kristall and start a new branch! User creation could be quietly creating SSH keys in the background. The folder list is an SFTP connection. The rest is just some pretty UI. Or maybe it's much more robust than that! Maybe this whole thing uses Titan and creates accounts through some neat one-off protocol handshakey stuff. It really doesn't matter at all. The point is that the user will have something that feels seamless. It feels easy and natural. And, quite importantly, the web had nothing to do with it.</p></div>
  84. <div class="section"><p class="section__content">For a v1, maybe it doesn't have a list of hosts available. Maybe the app is hard-wired to work with GemJournal.com only, that way the client author can also be a server maintainer and build both halves together. But really, based on the amazing craziness you all do already I don't see any of this as far fetched.</p></div>
  85. <p class="section"><span class="section__type"> ##</span><h2 class="section__content">Impact</h2></p>
  86. <div class="section"><p class="section__content">This little app concept has some real potential for impact to our ecosystem as well. If people can join the space without any technical knowledge beyond the gemtext editor (hey, how about a WYSIWYG?) we can truly get beyond that frustrating limitation where we talk about our own protocol (like this gemlog!) all the time. We can get that influx of educators, of artists, of writers. </p></div>
  87. <div class="section"><p class="section__content">A writing platform that cuts out all the cruft and tracking and ads? And all I need to do is download this app and join? Oh, it's free! Hell's yes! Thanks for making it so easy!</p></div>
  88. <div class="section"><p class="section__content">Originally Published 2021-11-03 at:</p></div>
  89. <div class="section"><p class="section__content">gemini://tilde.team/~tomasino/journal/20211103-making-gemini-easy.gmi</p></div>
  90. <div class="section"><p class="section__content">If you have questions or thoughts to add please send me a link to your response.</p></div>
  91. </article>
  92. <hr>
  93. <footer>
  94. <p>
  95. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  96. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  97. </svg> Accueil</a> •
  98. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  99. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  100. </svg> Suivre</a> •
  101. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  102. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  103. </svg> Pro</a> •
  104. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  105. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  106. </svg> Email</a> •
  107. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  108. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  109. </svg> Légal</abbr>
  110. </p>
  111. <template id="theme-selector">
  112. <form>
  113. <fieldset>
  114. <legend><svg class="icon icon-brightness-contrast">
  115. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  116. </svg> Thème</legend>
  117. <label>
  118. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  119. </label>
  120. <label>
  121. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  122. </label>
  123. <label>
  124. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  125. </label>
  126. </fieldset>
  127. </form>
  128. </template>
  129. </footer>
  130. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  131. <script>
  132. function loadThemeForm(templateName) {
  133. const themeSelectorTemplate = document.querySelector(templateName)
  134. const form = themeSelectorTemplate.content.firstElementChild
  135. themeSelectorTemplate.replaceWith(form)
  136. form.addEventListener('change', (e) => {
  137. const chosenColorScheme = e.target.value
  138. localStorage.setItem('theme', chosenColorScheme)
  139. toggleTheme(chosenColorScheme)
  140. })
  141. const selectedTheme = localStorage.getItem('theme')
  142. if (selectedTheme && selectedTheme !== 'undefined') {
  143. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  144. }
  145. }
  146. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  147. window.addEventListener('load', () => {
  148. let hasDarkRules = false
  149. for (const styleSheet of Array.from(document.styleSheets)) {
  150. let mediaRules = []
  151. for (const cssRule of styleSheet.cssRules) {
  152. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  153. continue
  154. }
  155. // WARNING: Safari does not have/supports `conditionText`.
  156. if (cssRule.conditionText) {
  157. if (cssRule.conditionText !== prefersColorSchemeDark) {
  158. continue
  159. }
  160. } else {
  161. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  162. continue
  163. }
  164. }
  165. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  166. }
  167. // WARNING: do not try to insert a Rule to a styleSheet you are
  168. // currently iterating on, otherwise the browser will be stuck
  169. // in a infinite loop…
  170. for (const mediaRule of mediaRules) {
  171. styleSheet.insertRule(mediaRule.cssText)
  172. hasDarkRules = true
  173. }
  174. }
  175. if (hasDarkRules) {
  176. loadThemeForm('#theme-selector')
  177. }
  178. })
  179. </script>
  180. </body>
  181. </html>