A place to cache linked articles (think custom and personal wayback machine)
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

index.md 25KB

2 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. title: Gemini is Solutionism at its Worst
  2. url: https://マリウス.com/gemini-is-solutionism-at-its-worst/
  3. hash_url: cb9e84580f4cb201995be13a7df2117b
  4. <p class="post-content-excerpt">While I don’t care too much about ideas and projects that I believe to be
  5. dead ends or maybe even doomed to fail eventually, a recent interaction on
  6. <a href="https://マリウス.com/superhighway84">Superhighway84</a> got me to write down a few thoughts on
  7. why I believe Project Gemini is a really bad idea.</p>
  8. <div class="post-content-body">
  9. <p>It all started with a simple post by someone on
  10. <a href="https://マリウス.com/superhighway84">Superhighway84</a> who shared a link to their Gemini site. While
  11. I was interested to see what that person was writing about and working on, I
  12. couldn’t, because that person did not share a HTTP link, with the Gemini URL
  13. as an alternative to it. Instead, it was only a Gemini URL.</p>
  14. <p>Up until a while ago, people were trying out Gemini and only used it as sort of
  15. a mirror for their HTTP content, meaning that everyone could browse their site
  16. one way or the other. However, it seems that more and more people these days
  17. have limited either all or parts of their publishing activity to Gemini. One
  18. better known example I stumbled upon is Drew DeVault, who has been publishing
  19. Gemini-exclusive content for a while now.</p>
  20. <p>As long as projects like Gemini don’t make it harder for people, that aren’t
  21. interested in them, to continue using the internet the way they’re comfortable
  22. with, I don’t have much of an opinion on them. However, with Gemini seemingly
  23. taking over more and more chunks of the things I consume, I felt like pointing
  24. out a few things about the project that I believe make it a really bad idea to
  25. pursue.</p>
  26. <p>My reply to the person’s post on Superhighway84 was the following:</p>
  27. <blockquote>
  28. <p>Hey there,</p>
  29. <p>let me throw in some unpopular opinion, if I might.</p>
  30. <p>I understand where people promoting the smol web (a.k.a Gemini) are coming from
  31. and I feel the same pain on a daily basis. The modern web sucks.
  32. However, I feel like Gemini is <em>solutionism at its worst</em>. If you compare a
  33. single HTTP/1.1 request with a Gemini request you will find out that it’s not
  34. the protocol that’s the issue. HTTP can be made incredibly light. In fact, it
  35. can be so light that even embedded devices (e.g. Arduinos) these days know how
  36. to talk it.</p>
  37. <p>What Gemini is doing, is saying “we don’t need no videos, images, stylesheets,
  38. nor JavaScripts, because we want to have a lightweight web experience, so we
  39. throw all that crap out!”. Fine, sounds great. But why does it require a new
  40. protocol for that? Why couldn’t one simply build on top of existing HTTP
  41. infrastructure, throw away all the baggage and instead implement a new
  42. Content-Type, which existing browsers then could parse?</p>
  43. <p>Existing infrastructure could have been extended to offer a more lightweight
  44. experience of the web that doesn’t come with JS, CSS or anything else. People
  45. then could decide whether they want to go the extra mile of installing Lagrange
  46. or any other dedicated Gemini browser, or simply have a browser extension that
  47. would take care of rendering the Content-Type properly. But Gemini forces people
  48. into a completely different stack. Different servers. Different browsers. Heck,
  49. not even it’s “markdown” is actual markdown, because&amp;mldr;</p>
  50. <blockquote>
  51. <p>There are actually many subtly different and incompatible variants of Markdown
  52. in existence, so unlike TLS all the different libraries are not guaranteed to
  53. behave similarly.</p>
  54. </blockquote>
  55. <p>&amp;mldr; and that’s why it’s obviously a good idea to introduce <strong>another</strong> variant
  56. of Markdown. Makes sense?</p>
  57. <p>Pretty much everything that is being described in the Gemini FAQ could have been
  58. solved on top of already existing protocols and technologies, making it more
  59. available to people. (<a href="https://gemini.circumlunar.space/docs/faq.gmi">https://gemini.circumlunar.space/docs/faq.gmi</a>)</p>
  60. <p>Also, Gemini is asking the wrong questions. For example:</p>
  61. <blockquote>
  62. <p>Why not just use a subset of HTTP and HTML?</p>
  63. </blockquote>
  64. <p>The question here shouldn’t be why not to use a subset of HTTP <em>and</em> HTML, but
  65. rather, why not build <em>on top of</em> HTTP with a different markup layer other than
  66. HTML. We have APIs using HTTP with JSON instead of HTML, for example.</p>
  67. <p>Hence, Gemini, its own text/gemini format, and most of its design choices are
  68. addressing problems that don’t really exist. It’s not significantly different to
  69. existing HTTP infrastructure to justify introducing a new protocol - and it even
  70. depends on it for e.g. offering large files for download.</p>
  71. <p>It’s also not IPFS or ZeroNet. It’s not a blockchain. It’s not bittorrent. It
  72. feels like the people working on/running Gemini infrastructure don’t want to
  73. actually solve the issues with the modern day web and instead just wanted to be
  74. different, for the sake of being different. But unlike for example DAT, that has
  75. truly been different, Gemini however follows the same outdated ideas and
  76. principles that have been around since the 80s and imposes restrictions on
  77. everything they’re not comfortable solving, e.g. file downloads or data
  78. submission.</p>
  79. <p>To me Gemini feels like today’s over-hyped computer version of Teletext.</p>
  80. </blockquote>
  81. <p>In order to make it clear what I mean by <em>building on top of existing HTTP
  82. infrastructure</em>, let me give an actual example.<br>
  83. When your web browser requests a website, it has to connect to the server
  84. hosting that website. That’s usually a TCP connection on port 80 or 443,
  85. depending on whether or not that website is using any sort of transport
  86. encryption. To keep it simple I’m not going into the details of SSL/TLS
  87. here, however, as it’s an encapsulation around the HTTP protocol, requesting
  88. content is identical no matter if the connection is encrypted or not.</p>
  89. <p>Let’s assume I’d like to browse
  90. <a href="http://motherfuckingwebsite.com">motherfuckingwebsite.com</a>. As soon as I enter
  91. the URL in my browser’s address bar, my browser is going to do pretty much the
  92. same that I’ll be doing here using the <code>telnet</code> command:</p>
  93. <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh">telnet motherfuckingwebsite.com <span class="m">80</span>
  94. Trying 108.62.0.112...
  95. Connected to motherfuckingwebsite.com.
  96. Escape character is <span class="s1">'^]'</span>.
  97. GET /index.html HTTP/1.1
  98. Host: motherfuckingwebsite.com
  99. </code></pre></div><p>That’s it.
  100. That’s the bare minimum that this server accepts in order for me to request
  101. the website from it. Most of the time however, browsers will send more
  102. information, like for example the <code>User-Agent</code>, the <code>Accept</code>, <code>Accept-Encoding</code>
  103. and <code>Accept-Language</code> headers, maybe some <code>Cache-Control</code> info, and more
  104. things, depending on which browser you use. While these bits of
  105. information are helping the communication, it’s not like requesting
  106. content without them wouldn’t work at all. The request that I typed into
  107. <code>telnet</code> does not contain any of these headers, yet the server successfully
  108. returns the website that I’m requesting, and even tells me how to interpret this
  109. response:</p>
  110. <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh">HTTP/1.1 <span class="m">200</span> OK
  111. Connection: Keep-Alive
  112. Keep-Alive: <span class="nv">timeout</span><span class="o">=</span>5, <span class="nv">max</span><span class="o">=</span><span class="m">100</span>
  113. content-type: text/html
  114. last-modified: Sun, <span class="m">18</span> Jan <span class="m">2015</span> 00:04:33 GMT
  115. accept-ranges: bytes
  116. content-length: <span class="m">5108</span>
  117. date: Sun, <span class="m">16</span> Jan <span class="m">2022</span> 22:10:29 GMT
  118. server: LiteSpeed
  119. &lt;!DOCTYPE html&gt;
  120. &lt;html&gt;
  121. &lt;head&gt;
  122. &lt;meta <span class="nv">charset</span><span class="o">=</span><span class="s2">"utf-8"</span>&gt;
  123. &lt;meta <span class="nv">name</span><span class="o">=</span><span class="s2">"viewport"</span> <span class="nv">content</span><span class="o">=</span><span class="s2">"width=device-width, initial-scale=1"</span>&gt;
  124. &lt;!-- FOR THE CURIOUS: This site was made by @thebarrytone. Don<span class="s1">'t tell my mom. --&gt;
  125. </span><span class="s1">
  126. </span><span class="s1"> &lt;title&gt;Motherfucking Website&lt;/title&gt;
  127. </span><span class="s1">&lt;/head&gt;
  128. </span><span class="s1">
  129. </span><span class="s1">&lt;body&gt;
  130. </span><span class="s1"> &lt;header&gt;
  131. </span><span class="s1"> &lt;h1&gt;This is a motherfucking website.&lt;/h1&gt;
  132. </span><span class="s1"> &lt;aside&gt;And it'</span>s fucking perfect.&lt;/aside&gt;
  133. &lt;/header&gt;
  134. &lt;h2&gt;Seriously, what the fuck <span class="k">else</span> <span class="k">do</span> you want?&lt;/h2&gt;
  135. &lt;p&gt;You probably build websites and think your shit is special. You think your <span class="m">13</span> megabyte parallax-ative home page is going to get you some fucking Awwward banner you can glue to the top corner of your site. You think your 40-pound jQuery file and <span class="m">83</span> polyfills give IE7 a boner because it finally has box-shadow. Wrong, motherfucker. Let me describe your perfect-ass website:&lt;/p&gt;
  136. &lt;ul&gt;
  137. &lt;li&gt;Shit<span class="s1">'s lightweight and loads fast&lt;/li&gt;
  138. </span><span class="s1"> &lt;li&gt;Fits on all your shitty screens&lt;/li&gt;
  139. </span><span class="s1"> &lt;li&gt;Looks the same in all your shitty browsers&lt;/li&gt;
  140. </span><span class="s1"> &lt;li&gt;The motherfucker'</span>s accessible to every asshole that visits your site&lt;/li&gt;
  141. &lt;li&gt;Shit<span class="s1">'s legible and gets your fucking point across (if you had one instead of just 5mb pics of hipsters drinking coffee)&lt;/li&gt;
  142. </span><span class="s1"> &lt;/ul&gt;
  143. </span><span class="s1">
  144. </span><span class="s1"> &lt;h3&gt;Well guess what, motherfucker:&lt;/h3&gt;
  145. </span><span class="s1">
  146. </span><span class="s1"> &lt;p&gt;You. Are. Over-designing. Look at this shit. It'</span>s a motherfucking website. Why the fuck <span class="k">do</span> you need to animate a fucking trendy-ass banner flag when I hover over that useless piece of shit? You spent hours on it and added <span class="m">80</span> kilobytes to your fucking site, and some motherfucker jabbing at it on their iPad with fat sausage fingers will never see that shit. Not to mention blind people will never see that shit, but they don<span class="s1">'t see any of your shitty shit.&lt;/p&gt;
  147. </span><span class="s1">
  148. </span><span class="s1"> &lt;p&gt;You never knew it, but this is your perfect website. Here'</span>s why.&lt;/p&gt;
  149. &lt;h2&gt;It<span class="s1">'s fucking lightweight&lt;/h2&gt;
  150. </span><span class="s1">
  151. </span><span class="s1"> &lt;p&gt;This entire page weighs less than the gradient-meshed facebook logo on your fucking Wordpress site. Did you seriously load 100kb of jQuery UI just so you could animate the fucking background color of a div? You loaded all 7 fontfaces of a shitty webfont just so you could say "Hi." at 100px height at the beginning of your site? You piece of shit.&lt;/p&gt;
  152. </span><span class="s1">
  153. </span><span class="s1"> &lt;h2&gt;It'</span>s responsive&lt;/h2&gt;
  154. &lt;p&gt;You dumbass. You thought you needed media queries to be responsive, but no. Responsive means that it responds to whatever motherfucking screensize it<span class="s1">'s viewed on. This site doesn'</span>t care <span class="k">if</span> you<span class="s1">'re on an iMac or a motherfucking Tamagotchi.&lt;/p&gt;
  155. </span><span class="s1">
  156. </span><span class="s1"> &lt;h2&gt;It fucking works&lt;/h2&gt;
  157. </span><span class="s1">
  158. </span><span class="s1"> &lt;p&gt;Look at this shit. You can read it ... that is, if you can read, motherfucker. It makes sense. It has motherfucking hierarchy. It'</span>s using HTML5 tags so you and your bitch-ass browser know what the fuck<span class="s1">'s in this fucking site. That'</span>s semantics, motherfucker.&lt;/p&gt;
  159. &lt;p&gt;It has content on the fucking screen. Your site has three bylines and link to your dribbble account, but you spread it over <span class="m">7</span> full screens and make me click some bobbing button to show me how cool the jQuery ScrollTo plugin is.&lt;/p&gt;
  160. &lt;p&gt;Cross-browser compatibility? Load this motherfucker in IE6. I fucking dare you.&lt;/p&gt;
  161. &lt;h2&gt;This is a website. Look at it. You<span class="s1">'ve never seen one before.&lt;/h2&gt;
  162. </span><span class="s1">
  163. </span><span class="s1"> &lt;p&gt;Like the man who'</span>s never grown out his beard has no idea what his <span class="nb">true</span> natural state is, you have no fucking idea what a website is. All you have ever seen are shitty skeuomorphic bastardizations of what should be text communicating a fucking message. This is a real, naked website. Look at it. It<span class="s1">'s fucking beautiful.&lt;/p&gt;
  164. </span><span class="s1">
  165. </span><span class="s1"> &lt;h3&gt;Yes, this is fucking satire, you fuck&lt;/h3&gt;
  166. </span><span class="s1">
  167. </span><span class="s1"> &lt;p&gt;I'</span>m not actually saying your shitty site should look like this. What I<span class="s1">'m saying is that all the problems we have with websites are &lt;strong&gt;ones we create ourselves&lt;/strong&gt;. Websites aren'</span>t broken by default, they are functional, high-performing, and accessible. You <span class="nb">break</span> them. You son-of-a-bitch.&lt;/p&gt;
  168. &lt;blockquote <span class="nv">cite</span><span class="o">=</span><span class="s2">"https://www.vitsoe.com/us/about/good-design"</span>&gt;<span class="s2">"Good design is as little design as possible."</span>&lt;br&gt;
  169. - some German motherfucker
  170. &lt;/blockquote&gt;
  171. &lt;hr&gt;
  172. &lt;h2&gt;Epilogue&lt;/h2&gt;
  173. &lt;p&gt;From the philosophies expressed <span class="o">(</span>poorly<span class="o">)</span> above, &lt;a <span class="nv">href</span><span class="o">=</span><span class="s2">"http://txti.es"</span>&gt;txti&lt;/a&gt; was created. You should try it today to make your own motherfucking websites.&lt;/p&gt;
  174. &lt;!-- yes, I know...wanna fight about it? --&gt;
  175. &lt;script&gt;
  176. <span class="o">(</span><span class="k">function</span><span class="o">(</span>i,s,o,g,r,a,m<span class="o">){</span>i<span class="o">[</span><span class="s1">'GoogleAnalyticsObject'</span><span class="o">]=</span>r<span class="p">;</span>i<span class="o">[</span>r<span class="o">]=</span>i<span class="o">[</span>r<span class="o">]||</span><span class="k">function</span><span class="o">(){</span>
  177. <span class="o">(</span>i<span class="o">[</span>r<span class="o">]</span>.q<span class="o">=</span>i<span class="o">[</span>r<span class="o">]</span>.q<span class="o">||[])</span>.push<span class="o">(</span>arguments<span class="o">)}</span>,i<span class="o">[</span>r<span class="o">]</span>.l<span class="o">=</span>1*new Date<span class="o">()</span><span class="p">;</span><span class="nv">a</span><span class="o">=</span>s.createElement<span class="o">(</span>o<span class="o">)</span>,
  178. <span class="nv">m</span><span class="o">=</span>s.getElementsByTagName<span class="o">(</span>o<span class="o">)[</span>0<span class="o">]</span><span class="p">;</span>a.async<span class="o">=</span>1<span class="p">;</span>a.src<span class="o">=</span>g<span class="p">;</span>m.parentNode.insertBefore<span class="o">(</span>a,m<span class="o">)</span>
  179. <span class="o">})(</span>window,document,<span class="s1">'script'</span>,<span class="s1">'//www.google-analytics.com/analytics.js'</span>,<span class="s1">'ga'</span><span class="o">)</span><span class="p">;</span>
  180. ga<span class="o">(</span><span class="s1">'create'</span>, <span class="s1">'UA-45956659-1'</span>, <span class="s1">'motherfuckingwebsite.com'</span><span class="o">)</span><span class="p">;</span>
  181. ga<span class="o">(</span><span class="s1">'send'</span>, <span class="s1">'pageview'</span><span class="o">)</span><span class="p">;</span>
  182. &lt;/script&gt;
  183. &lt;/body&gt;
  184. &lt;/html&gt;
  185. </code></pre></div><p>On the other hand, according to its specification, a request on the Gemini
  186. protocol looks like this:</p>
  187. <blockquote>
  188. <p>2 Gemini requests</p>
  189. <p>Gemini requests are a single CRLF-terminated line with the following structure:</p>
  190. <p>&lt;URL&gt;&lt;CR&gt;&lt;LF&gt;</p>
  191. <p>&lt;URL&gt; is a UTF-8 encoded absolute URL, including a scheme, of maximum length
  192. 1024 bytes. The request MUST NOT begin with a U+FEFF byte order mark.</p>
  193. <p>Sending an absolute URL instead of only a path or selector is effectively
  194. equivalent to building in a HTTP “Host” header. It permits virtual hosting of
  195. multiple Gemini domains on the same IP address. It also allows servers to
  196. optionally act as proxies. Including schemes other than “gemini” in requests
  197. allows servers to optionally act as protocol-translating gateways to e.g. fetch
  198. gopher resources over Gemini. Proxying is optional and the vast majority of
  199. servers are expected to only respond to requests for resources at their own
  200. domain(s).</p>
  201. <p>Clients MUST NOT send anything after the first occurrence of &lt;CR&gt;&lt;LF&gt; in a
  202. request, and servers MUST ignore anything sent after the first occurrence of a
  203. &lt;CR&gt;&lt;LF&gt;.</p>
  204. </blockquote>
  205. <p>When comparing the most minimal version of an HTTP request with a standard
  206. Gemini request, it turns out that the only difference is a single additionally
  207. required header (<code>Host</code>) and a few additional characters (<code>GET</code> and <code>HTTP/1.1</code>)
  208. in the HTTP request. Hence, Gemini’s argument of being <em>“lighter than the web”</em>
  209. doesn’t make that much of a difference at all from a protocol perspective, and
  210. it certainly does not justify <strong>completely replacing existing infrastructure and
  211. standards that humans have mutually agreed upon</strong>.</p>
  212. <p><em>“But what about the response and the content?"</em>, you might be wondering.
  213. Well, it’s a similar story there. By default, regular HTTP servers will include
  214. all sorts of information in their response that will allow the browser to
  215. process it more easily/without a lot of <em>guesstimating</em>. However, it would
  216. nevertheless be possible to bend existing HTTP servers to only include the bare
  217. minimum additional info in their response, that would still allow a modern
  218. browser to process the data.</p>
  219. <p>As for the actual content, it is easily possible to configure a modern HTTP
  220. server like nginx to respond with nothing but pure Markdown. Users could then
  221. install either of the
  222. <a href="https://addons.mozilla.org/en-US/firefox/addon/markdown-viewer-webext/">dozens</a>
  223. of
  224. <a href="https://addons.mozilla.org/en-US/firefox/addon/markdown-viewer-chrome/">extensions</a>
  225. available for their web browser, to be able to visit the Markdown-only websites
  226. more comfortably. If Gemini would have gone that path, people interested in <em>the
  227. smol internet</em> would still be able to develop custom tailored clients that only
  228. work with these type of websites, and that would not include all the baggage that
  229. comes with any modern browser. Everybody else, on the other hand, could continue
  230. using the tools their familiar with and would still be able to to consume the
  231. content.</p>
  232. <p>Gemini instead opted for a different direction, which <strong>actively excludes people</strong>,
  233. while it <strong>does not deliver anything new nor beneficial</strong> that would justify
  234. dismissing existing standards and infrastructure in first place. Gemini is
  235. solutionism at its worst and is more about exclusion of the mainstream over
  236. bringing actual technological advancement, let alone fixing the issues it
  237. baselessly claims to be fixing. Gemini does not bring new ideas to the table,
  238. but instead uses decade old concepts from HTTP and Gopher, to implement a
  239. castrated and badly designed version of its own, just for the sake of it not
  240. being HTTP nor Gopher.</p>
  241. <blockquote>
  242. <p>To me, Gemini looks like a mix of Gopher and HTTP/0.9 and it’s a mystery to me
  243. why you would rather write a new protocol so similar to those rather than just
  244. stick to what already exists.<br>
  245. – <a href="https://curl.se/mail/lib-2020-11/0084.html">Daniel Stenberg, founder and lead developer of cURL</a></p>
  246. </blockquote>
  247. <p><em>“But&amp;mldr; but&amp;mldr; it takes user privacy <strong>very seriously</strong>?"</em><br>
  248. Okay, how so? Let’s quickly check the FAQ:</p>
  249. <blockquote>
  250. <p>2.1.2 Privacy</p>
  251. <p>Gemini is designed with an acute awareness that the modern web is a privacy
  252. disaster, and that the internet is not a safe place for plaintext. Things like
  253. browser fingerprinting and Etag-based “supercookies” are an important cautionary
  254. tale: user tracking can and will be snuck in via the backdoor using protocol
  255. features which were not designed to facilitate it. Thus, protocol designers must
  256. not only avoid designing in tracking features (which is easy), but also assume
  257. active malicious intent and avoid designing anything which could be subverted to
  258. provide effective tracking. This concern manifests as a deliberate
  259. non-extensibility in many parts of the Gemini protocol.</p>
  260. </blockquote>
  261. <p>Turns out, neither the FAQ nor the protocol precisely pin-point how exactly
  262. Gemini takes <em>privacy seriously</em>. They call out typical buzzwords like
  263. <em>supercookies</em> and <em>fingerprinting</em> and suggest that due to the protocol’s
  264. <em>non-extensibility</em> Gemini is more privacy-focused than the <em>modern web</em>. Then,
  265. on the other hand, Gemini users
  266. <a href="https://curl.se/mail/lib-2020-11/0083.html">write things like this</a>:</p>
  267. <blockquote>
  268. <ul>
  269. <li>Certificate verification. Gemini servers rarely use certificates with
  270. trust chain from certificates in /etc/ssl/certs; self-signed
  271. certificates are the norm. Option -k should be the default for gemini
  272. protocol.</li>
  273. </ul>
  274. </blockquote>
  275. <p>Ah yes, that is how <em>taking privacy seriously</em> looks like. Besides, what about
  276. the visitor’s IP address? Gemini servers can certaily see that. Nowhere in its
  277. official documentation Gemini seems to care about telling users this detail, let
  278. alone whether or not they’re able to browse via Tor or if there’s any client
  279. that would support Tor right out-of-the-box.</p>
  280. <p>Also, what if I wrote my own Gemini server – judging by its protocol that’s
  281. something one could do within a few hours – that would attach
  282. per-initial-request generated hashes to all links?
  283. Thereby, when a user visits my Gemini site, they would get a unique
  284. hash assigned, which would then be sent to my server every time they follow a
  285. link to a different subsite. I could track the user’s browsing behaviour across
  286. my site, just like HTTP sites do these days. If I store these requests,
  287. plus the IP address the user is coming from, I would already gather some
  288. interesting data points.<br>
  289. What if I would perform a quick investigation of the TCP/IP packets
  290. additionally? E.g. the initial packet size, the window- and segment-size, the
  291. initial TTL, individual flags? I could make my Gemini server use such
  292. fingerprinting techniques to gather more info and store that as well. If I’d
  293. be really up to something, I could have all sorts of additional checks and
  294. scans running for every new connection. Even if the user would connect through
  295. a NATted IP, I could eventually gain enough intel to be able to tell
  296. with relatively high confidence if a request was made by a visitor I’ve seen
  297. before or not, especially with such a small user-base (as compared to HTTP).
  298. Let alone all the still to be discovered exploits within individual client
  299. implementations, that might as well lead to potential privacy or even security
  300. risks.</p>
  301. <p>Bottom line is, if you agree that the modern web has become an awful place,
  302. let’s work on changing that for everyone, instead of abandoning it like a
  303. bunch of billionaires trying to escape to a different place, before this
  304. one collapses.</p>
  305. <p>The reason this website looks the way it does, is not because it follows the
  306. latest online trends, but because it’s everything that is required to efficiently
  307. transport information from me to you, using tools that we’re both familiar with,
  308. while staying out of both our ways.<br>
  309. If you don’t like how modern websites track their users and flood them with
  310. ads, then don’t do that on your website, contribute to projects like
  311. uBlock Origin, Privacy Badger and Tor, and stop using websites that <strong>do</strong> track
  312. their users or spam them with ads.
  313. If you don’t like JavaScript, don’t use it or use it in a way in which
  314. your site will still function even without it, and stop using websites that won’t
  315. even load without JavaScript enabled.
  316. If you’re not a fan of CSS, don’t use it, nobody forces you to style your HTML
  317. and most browsers include a fairly accessible default stylesheet.
  318. Heck, if you’re as much of a purist as the Gemini folks claim to be and don’t
  319. want neither videos nor images on your website, simply don’t put any there.
  320. <a href="http://motherfuckingwebsite.com">motherfuckingwebsite.com</a> is a perfect example
  321. of a website that uses none of all that while still functioning flawlessly.</p>
  322. <p>Ultimately, serving content solely via Gemini will only lead to it becoming
  323. <strong>less</strong> accessible and available to other people. Moving to Gemini is the
  324. opposite of inclusive, it’s exclusive. It’s a step in the wrong direction.</p>