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

5 months ago
5 months ago
5 months ago
5 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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>
  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>The Return of the 90s Web (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="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <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>
  30. <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>
  31. <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>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://mxb.dev/blog/the-return-of-the-90s-web/">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>The Return of the 90s Web</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="https://mxb.dev/blog/the-return-of-the-90s-web/" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p class="lead">In big cultural concepts like music or fashion, things have a way of coming around full circle. I'm pretty sure someday grunge will come back as a hot new sample, and at some point our kids might think frosted hair tips are totally cool.</p>
  69. <p>When I look at some of the trends on the web today, I wonder if we’re at that point yet. I wonder if we’re ready to revisit some of the ideas of the early web again.</p>
  70. <p>Probably not in design - I’m afraid <code>dancing-baby.gif</code> is gone for good. But some of the broader ideas from back then are picking up a second wind lately, and I like it.</p>
  71. <h2 id="h-serverside-rendering"><a class="heading-anchor" href="#h-serverside-rendering">#</a> Serverside Rendering</h2>
  72. <p>After spending the better part of the last decade shifting rendering logic to the client, it looks like the pendulum is about to swing into the other direction again.</p>
  73. <p>With projects like <a href="https://www.phoenixframework.org/">Phoenix Liveview</a> or <a href="https://hey.com/how-it-works/">hey.com</a>’s recent “it’s-just-HTML” approach, it seems like server-side rendering (SSR) is stepping back into the spotlight.</p>
  74. <p>It makes sense - servers are <strong>really good</strong> at this, and sending compressed HTML through the network can be lightning fast. The classic request-response cycle has evolved as well: HTTP/2 and smart techniques like <a href="https://github.com/turbolinks/turbolinks">Turbolinks</a> or <a href="https://instant.page/">just-in-time preloading</a> allow for a much better experience now than when you first tried to load that Michael Jordan photo on the Space Jam website over dial-up.</p>
  75. <p>Taking the responsibility of rendering UI and all the Javascript that comes with it off users’ shoulders would be a great <s>old</s> new strategy for the next generation of web apps.</p>
  76. <p><a href="https://en.wikipedia.org/wiki/Microsoft_FrontPage">Frontpage</a> and <a href="https://en.wikipedia.org/wiki/Adobe_Dreamweaver">Dreamweaver</a> were big in the 90s because of their “What You See Is What You Get” interface. People could set up a website without any coding skills, just by dragging boxes and typing text in them.</p>
  77. <p>Of course they soon found that there was still source code underneath, you just didn’t see it. And most of the time, that source code was a big heap of auto-generated garbage - it ultimately failed to keep up with the requirements of the modern web.</p>
  78. <figure class="extend"><a href="https://webflow.com" rel="noopener noreferrer" target="_blank"><img src="/assets/media/return-of-the-90s-web/webflow.jpg" alt="the webflow interface, different design widgets and controls" loading="lazy"/></a></figure>
  79. <p>Today our understanding of the web has improved, and so have our tools. <a href="https://webflow.com/">Webflow</a> is one of the contenders for the “no-code editor” trophy. The output it generates is far better.</p>
  80. <p>These tools will probably not be a replacement for developers as a whole - complex projects still require tons of human brainpower to work. But for all the landing pages and marketing sites, this could be the holy grail of <abbr title="What you see is what you get">WYSIWYG</abbr> we thought we had in the 90s.</p>
  81. <h2 id="h-personal-websites"><a class="heading-anchor" href="#h-personal-websites">#</a> Personal Websites</h2>
  82. <p>It might just be my IndieWeb filter bubble talking, but I think there is a renewed interest in personal websites. A lot of big social media giants are falling out of favor, and it becomes cool again to <strong>own a space</strong> on the web rather then being one of a billion usernames.</p>
  83. <p>Our digitial identities are becoming increasingly more important, and people become aware that they’re not in control of their data. Personal sites were very popular in the era before Myspace and Facebook, and it’s now easier than ever to build one.</p>
  84. <p>Services like <a href="https://carrd.co/">Carrd</a> offer a straightforward way to create simple one-pagers, and their numbers show a lot of interest:</p>
  85. <p>Blogging is gaining popularity again as well, used as a tool for self-marketing or simply to express opinions. There are lots of good options for people who want to pick up blogging - either on their own sites or with platforms like <a href="http://micro.blog/">micro.blog</a>, that offer more independence than Medium &amp; Co.</p>
  86. <h2 id="h-curated-feeds-and-discovery"><a class="heading-anchor" href="#h-curated-feeds-and-discovery">#</a> Curated Feeds and Discovery</h2>
  87. <p>Another issue created by social media is the prevalence of “algorithmic feeds”. We decided that the constant stream of input for our eyeballs should never end, so we built these complex systems to generate new content for us based on our interests.</p>
  88. <p>But these are giant black boxes, and nobody really knows what signals go into them. Throw advertising, “fake news” and a couple of trolls into the mix, and you get the mess we all know now.</p>
  89. <p>That’s why many people crave a <strong>more controlled reading experience</strong> on their own terms. Chronological, personal, relevant - a bespoke magazine of trusted sources. A curated feed.</p>
  90. <p>One way to achieve something like that is through plain ol’ boring RSS. One more thing that was said to be dead but is growing in popularity again:</p>
  91. <p>Another possibility is to discover new content through human connections instead of algorithms. People we already know for their content recommend others in the same field, creating decentralized clusters of trusted information.</p>
  92. <p>Website owners used to do this a lot in the days before search engines, by providing <a href="/blogroll/">Blogroll Pages</a> or forming <a href="https://en.wikipedia.org/wiki/Webring">Webrings</a> with links to others in their cluster.</p>
  93. <div class="callout callout--info"><span class="callout__icon"><svg class="icon icon--info" role="img" aria-hidden="true"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/assets/icons/icons.sprite.svg#icon-info"/></svg></span><div class="callout__content"><p><strong>Webrings</strong> were a common way for people to connect their sites in the early web. To be a member of a webring, you had to embed a little widget on your site that contained a “forward”, a “backward”, and a “random” button. These buttons would then link to other sites in the ring.</p><p>BTW: If you want to host your own webring, I made this free <a href="/blog/webring-kit/">Starter Kit</a> for you.</p></div></div>
  94. <p><webring-banner><p>Member of the <a href="https://webringdemo.netlify.com">An Example Webring</a> webring</p><a href="https://webringdemo.netlify.com/prev">Previous</a> <a href="https://webringdemo.netlify.com/random">Random</a> <a href="https://webringdemo.netlify.com/next">Next</a></webring-banner>
  95. <h2 id="h-smaller-communities-and-web-monetization"><a class="heading-anchor" href="#h-smaller-communities-and-web-monetization">#</a> Smaller Communities and Web Monetization</h2><p>Many independent creators are moving away from big “everyone’s on them” platforms back to private, more niche communities. New models for membership sites like <a href="https://ghost.org/members/">Ghost’s “Members”</a> feature enable creators to build communities on their content. People teach courses, self-publish books or provide APIs for specific topics.</p><p>Where the 90s had chatrooms and message boards, today there are tools like <a href="https://discord.com/">Discord</a> or <a href="https://www.twitch.tv/">Twitch</a> that help people with shared interests to connect with each other. These niche communities can then be a powerful userbase for independent businesses.</p><p>Of course the problem of monetization has existed from the very start of the web, and it’s still not easy today to earn money without splattering ads everywhere. But new standards like the <a href="https://webmonetization.org/">Web Monetization API</a> could be a very interesting solution, enabling creators to <a href="https://coil.com/">receive micro-payments</a> for their content.</p>
  96. <h2 id="h-learning-from-the-past"><a class="heading-anchor" href="#h-learning-from-the-past">#</a> Learning from the Past</h2><p>I don’t know if all of these trends will really play out, or if we’re up for something completely different. I do think it’s a good idea to learn from the past though, because that is what keeps us moving forward.</p><p>So maybe the second 90s can be even better than the first. At least we’re done with NSYNC this time.</p></p>
  97. </main>
  98. </article>
  99. <hr>
  100. <footer>
  101. <p>
  102. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  103. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  104. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  105. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  106. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  107. </p>
  108. <template id="theme-selector">
  109. <form>
  110. <fieldset>
  111. <legend>Thème</legend>
  112. <label>
  113. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  114. </label>
  115. <label>
  116. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  117. </label>
  118. <label>
  119. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  120. </label>
  121. </fieldset>
  122. </form>
  123. </template>
  124. </footer>
  125. <script type="text/javascript">
  126. function loadThemeForm(templateName) {
  127. const themeSelectorTemplate = document.querySelector(templateName)
  128. const form = themeSelectorTemplate.content.firstElementChild
  129. themeSelectorTemplate.replaceWith(form)
  130. form.addEventListener('change', (e) => {
  131. const chosenColorScheme = e.target.value
  132. localStorage.setItem('theme', chosenColorScheme)
  133. toggleTheme(chosenColorScheme)
  134. })
  135. const selectedTheme = localStorage.getItem('theme')
  136. if (selectedTheme && selectedTheme !== 'undefined') {
  137. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  138. }
  139. }
  140. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  141. window.addEventListener('load', () => {
  142. let hasDarkRules = false
  143. for (const styleSheet of Array.from(document.styleSheets)) {
  144. let mediaRules = []
  145. for (const cssRule of styleSheet.cssRules) {
  146. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  147. continue
  148. }
  149. // WARNING: Safari does not have/supports `conditionText`.
  150. if (cssRule.conditionText) {
  151. if (cssRule.conditionText !== prefersColorSchemeDark) {
  152. continue
  153. }
  154. } else {
  155. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  156. continue
  157. }
  158. }
  159. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  160. }
  161. // WARNING: do not try to insert a Rule to a styleSheet you are
  162. // currently iterating on, otherwise the browser will be stuck
  163. // in a infinite loop…
  164. for (const mediaRule of mediaRules) {
  165. styleSheet.insertRule(mediaRule.cssText)
  166. hasDarkRules = true
  167. }
  168. }
  169. if (hasDarkRules) {
  170. loadThemeForm('#theme-selector')
  171. }
  172. })
  173. </script>
  174. </body>
  175. </html>