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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="en">
  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>Where I’m at on the whole CSS-Tricks thing (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. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <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>
  34. <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>
  35. <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>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://chriscoyier.net/2024/02/28/where-im-at-on-the-whole-css-tricks-thing/">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>Where I’m at on the whole CSS-Tricks thing</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://chriscoyier.net/2024/02/28/where-im-at-on-the-whole-css-tricks-thing/" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-02-28
  72. </p>
  73. </nav>
  74. <hr>
  75. <p>It was March 2022 when I sold CSS-Tricks to DigitalOcean. So it’s been just about 2 years now. </p>
  76. <p>This was me and my wife’s thinking: </p>
  77. <ul>
  78. <li>The negotiated sale price was fair.</li>
  79. <li>They are a big company (public!) with tons of resources, and their clear stated strategy was to invest in content and community, because that’s where the top of the funnel is, and it’s good for business. They didn’t just talk this way, they were obviously <em>investing</em> in content and community. There is a chance CSS-Tricks becomes <em>better</em>.</li>
  80. <li>They were already decently well known for good content in DevOps and Back End, but were missing solid Front-End content. Filling this gap makes sense.</li>
  81. <li>They would rip all the ads off the site. There would be only one “ad”: use DigitalOcean. I’m no advertising hater, it’s always been good to me, but the thought of CSS-Tricks as a clean ad-free site was appealing.</li>
  82. <li>They would keep on Geoff, the lead editor, if he wanted it. He did and they did.</li>
  83. <li> I was <em>way way</em> too busy trying to run CSS-Tricks and co-run CodePen and it was hard on me. </li>
  84. </ul>
  85. <p>After the sale, things seemed kinda fine for a bit, and that was encouraging. It was cool seeing new voices publishing new work I had nothing to do with. Then started to limp, using up the momentum that it had. </p>
  86. <p>A year later they <a href="https://geoffgraham.me/goodbye-css-tricks/">fired Geoff</a> along with everyone else working on content and community. That was the real torpedo.</p>
  87. <p>It seems DigitalOcean got excited when the whole industry started doing huge layoffs, they followed suit and slurped up the profits. The necessary directional change was: screw content and community. A month after that, the last article was published on CSS-Tricks, an overview of Passkeys, which will now apparently be on the homepage forever, a <em>very</em> strange bit of content to emblazon the tombstone of the site. They also added a cookie button that looks like a 4th grader designed it?? And started publishing every blog post as a guide???</p>
  88. <p> How do I feel about all that? Well I’m not <em>stoked</em>, but I’m an adult I knew the risks. I sold the site. They now control it. They can do whatever they want with it. They could replace the entire site with an <code>&lt;h1&gt;</code> tag that says <strong>Chris Coyier smells like donkeys</strong> and that would be their right.</p>
  89. <p>I’ve heard from plenty of people who are pissed. Some are pissed at me. Sellout, yadda yadda. But I’m actually fairly pleased that the site is still online, relatively untouched, and with everybody’s bylines, including my own, intact. That’s a better outcome than scotch.io, purchased from Chris Sev, which was neutered and ultimately turned off. That’s a much more inglorious ending that I hope never happens to CSS-Tricks.</p>
  90. <p>Hopefully that doesn’t happen, although during my 3-month consulting period I know they were very interested in porting the content to their own internal SSG system. As someone who has built a lot of SSG-powered sites and a lot of WordPress-sites, all I can say is CSS-Tricks is WordPress-y<em>-as-hell,</em> and I cannot possibly imagine a conversion that maintains any level of quality as being worth the effort. </p>
  91. <p>A lot more people are pissed at DigitalOcean. People saying they’ll never use them again, and generally upset they’d take such a useful asset and do nothing with it. A void in the industry that doesn’t sit right.</p>
  92. <p>Does any of this negative sentiment actually affect DigitalOcean meaningfully? I have no clue. It can’t <em>help</em>, but I’m sure if it was <em>that</em> big of a deal they would prioritize fixing it somehow. It seems more likely it’s a <em>oh well you win some you lose some shrug it off situation</em>. It’s almost certainly not acting as that strong top-of-funnel player they originally were hoping for it. </p>
  93. <hr class="wp-block-separator has-alpha-channel-opacity">
  94. <p>I bet you could probably guess all that, or piece it together from things publicly said. </p>
  95. <p>What you probably don’t know is that I tried to get it back. </p>
  96. <p>I got an email from a fella a while back who is now a VP of Content &amp; Community at DigitalOcean who came over from the Cloudways acquisition. I think “ownership” of CSS-Tricks kinda fell is his lap after some internal shifts. Unlike his predecessors, he didn’t have any hangups about just talking directly to me. What he originally wanted was just to learn what it’s going to take to get spun back up and producing again. A “return on investment” is what he was after, understandably. I was as frank with him as I am with anyone: It’s gonna take a lot. They would need a new lead editor, and you might be able to see how people might be squeamish about that role with the last one publicly axed not long ago. <em>Maybe</em> that person knows WordPress development pretty well? If not, ideally, you have someone know that knows WordPress pretty well, because the site uses <a href="https://css-tricks.com/css-tricks-is-a-poster-child-wordpress-site/">everything</a>. And maybe that person knows how to wrangle up really good front-end specific writers? If you find that magical person, that’s a developer, writer, community builder, and site-running editor, it’s going to be expensive. More likely you gotta build a team again, and it’s going to take them a while to get things going, so your investment gets deeper and deeper, while the return remains unclear.</p>
  97. <p>This got me thinking. </p>
  98. <p>Maybe a little braggadocious here, <em>butttt</em> I’m basically the perfect person for the job. Let’s just say the most perfect person on Earth for the job lolz.</p>
  99. <p>But I’m not even sure I’d want to do it again, and I have no idea if they would even want me to. But I definitely don’t wanna do free consulting work on it. </p>
  100. <p>So I took my big swing.</p>
  101. <blockquote class="wp-block-quote">
  102. <p>Here’s my best (and wildest) idea. </p>
  103. <p>I run CSS-Tricks again myself. CSS-Tricks is big and complicated. Anybody walking in the door alone is going to have a serious learning curve just in getting comfortable operating the basics. I already know every inch of it. </p>
  104. <p>I get people reading again. I get people writing again. I get people excited again. I erase any bad mojo against DigitalOcean, fix that brand damage. Get people saying they <em>want</em> to use DigitalOcean instead of saying they never will again. (e.g. <a href="https://twitter.com/AdamRackis/status/1691928618912387283">1</a>, <a href="https://twitter.com/stolinski/status/1691942771035168887">2</a>, <a href="https://twitter.com/awkroot/status/1692046926211150153">3</a>)</p>
  105. <p>Then we do the most valuable possible thing for DigitalOcean: get content on there that helps people know about and do things on DigitalOcean. There are some big wins there. Astro is big right now in front-end, why isn’t DigitalOcean on <a href="https://docs.astro.build/en/guides/deploy/">this list</a>? Let’s get that article written and linked up.</p>
  106. <p>We can make a special section of the site that is just DigitalOcean content, making it easy to browse and find stuff. </p>
  107. <p>Then we do the second most valuable thing we can do: move the hosting to DigitalOcean and have it be a living, breathing endorsement of DO being a great place to host a WordPress website. </p>
  108. <p>Now we’re back in action.</p>
  109. <p>Why would I do that?</p>
  110. <p>You transfer ownership of CSS-Tricks back to me. </p>
  111. <p>Why would <em>you</em> do that?</p>
  112. <ul>
  113. <li>You’re trying to get to break even on it. This means you aren’t spending any <em>more</em> money and time. You’re now just extracting marketing, branding, and conversion value out of money already spent.</li>
  114. <li>You don’t have to spend any more time on this, personally or institutionally. Any other internal costs are gone.</li>
  115. <li>The community will love it.</li>
  116. </ul>
  117. <p>The trick is in the details. We’d get to an agreement on what has to happen for it to work. For example, no other web host can be advertised on the site for X time, etc. </p>
  118. </blockquote>
  119. <p>I’d call that a big swing, anyway. <em>I’ll just take it back please and thank you.</em> But I feel like I made the case OK that it’s not completely crazy.</p>
  120. <p>Crickets for a while.</p>
  121. <p>A few back and forth emails like <em>“still thinking about this…</em>” later, and the conclusion is that the fella basically doesn’t have the “conviction to push it within the halls at DO”. </p>
  122. <p>Understandable, really. I wouldn’t want to be handed a huge golden nugget by my boss and then ask for a meeting and be like “I think we should give it back to the leprechaun.”</p>
  123. <p>When I pitched that, I wasn’t even 100% sure I wanted it, mainly for stress reasons. But I’m sure I could have figured out a way to run a more minimal ship with reduced stress and the site would be in a much more pleasant place. </p>
  124. <p>Anyway, if you want to know some basic information about Passkeys I know a site you can check out.</p>
  125. </article>
  126. <hr>
  127. <footer>
  128. <p>
  129. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  130. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  131. </svg> Accueil</a> •
  132. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  133. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  134. </svg> Suivre</a> •
  135. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  136. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  137. </svg> Pro</a> •
  138. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  139. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  140. </svg> Email</a> •
  141. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  142. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  143. </svg> Légal</abbr>
  144. </p>
  145. <template id="theme-selector">
  146. <form>
  147. <fieldset>
  148. <legend><svg class="icon icon-brightness-contrast">
  149. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  150. </svg> Thème</legend>
  151. <label>
  152. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  153. </label>
  154. <label>
  155. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  156. </label>
  157. <label>
  158. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  159. </label>
  160. </fieldset>
  161. </form>
  162. </template>
  163. </footer>
  164. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  165. <script>
  166. function loadThemeForm(templateName) {
  167. const themeSelectorTemplate = document.querySelector(templateName)
  168. const form = themeSelectorTemplate.content.firstElementChild
  169. themeSelectorTemplate.replaceWith(form)
  170. form.addEventListener('change', (e) => {
  171. const chosenColorScheme = e.target.value
  172. localStorage.setItem('theme', chosenColorScheme)
  173. toggleTheme(chosenColorScheme)
  174. })
  175. const selectedTheme = localStorage.getItem('theme')
  176. if (selectedTheme && selectedTheme !== 'undefined') {
  177. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  178. }
  179. }
  180. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  181. window.addEventListener('load', () => {
  182. let hasDarkRules = false
  183. for (const styleSheet of Array.from(document.styleSheets)) {
  184. let mediaRules = []
  185. for (const cssRule of styleSheet.cssRules) {
  186. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  187. continue
  188. }
  189. // WARNING: Safari does not have/supports `conditionText`.
  190. if (cssRule.conditionText) {
  191. if (cssRule.conditionText !== prefersColorSchemeDark) {
  192. continue
  193. }
  194. } else {
  195. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  196. continue
  197. }
  198. }
  199. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  200. }
  201. // WARNING: do not try to insert a Rule to a styleSheet you are
  202. // currently iterating on, otherwise the browser will be stuck
  203. // in a infinite loop…
  204. for (const mediaRule of mediaRules) {
  205. styleSheet.insertRule(mediaRule.cssText)
  206. hasDarkRules = true
  207. }
  208. }
  209. if (hasDarkRules) {
  210. loadThemeForm('#theme-selector')
  211. }
  212. })
  213. </script>
  214. </body>
  215. </html>