<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr-FR"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://adrius.blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://adrius.blog/" rel="alternate" type="text/html" hreflang="fr-FR" /><updated>2026-07-01T09:56:09+00:00</updated><id>https://adrius.blog/feed.xml</id><title type="html">adrius</title><subtitle>Projets, notes et idées d&apos;adrius.</subtitle><author><name>adrius</name></author><entry><title type="html">Buisson</title><link href="https://adrius.blog/posts/buisson/" rel="alternate" type="text/html" title="Buisson" /><published>2026-06-30T00:00:00+00:00</published><updated>2026-06-30T00:00:00+00:00</updated><id>https://adrius.blog/posts/buisson</id><content type="html" xml:base="https://adrius.blog/posts/buisson/"><![CDATA[<p>D’aussi loin que je me souvienne, j’ai toujours aimé customiser les choses que j’aimais.</p>

<p>Ça a commencé sur les jeux vidéo. World of Warcraft avec la transmogrification : des heures à parfaire l’apparence d’un personnage que j’allais regarder pendant des centaines d’autres heures.</p>

<p><img src="/images/buisson/winterhide-polar-death-knight-v0-un9wf6dvaupd1.webp" alt="Death Knight Winterhide" /></p>

<p><img src="/images/buisson/Paladin-Grand-Sentinels-Greatplate-1024x576.jpg" alt="Paladin Grand Sentinels" /></p>

<p>Diablo 3 aussi.</p>

<p><img src="/images/buisson/01-2049230877.jpg" alt="Diablo 3 transmog" />
<img src="/images/buisson/tumblr_n3v8xtaocw1twom05o1_1280-386900368.jpg" alt="Diablo 3 armure" /></p>

<p>Avec les années, cet amour de la customisation a évolué vers deux rabbit holes : le linux ricing et les claviers custom. Deux univers entiers construits autour d’une même idée.</p>

<p><img src="/images/buisson/everforest-VTw7rC-2036170529.png" alt="Everforest rice" />
<img src="/images/buisson/i-made-a-glsl-shader-based-reading-mode-that-mimics-e-ink-v0-vgrzv6nfoigg1.webp" alt="E-ink shader rice" /></p>

<p><img src="/images/buisson/IMG_4973.png" alt="Clavier custom" /></p>

<p>J’aime cette idée de <em>master your craft</em>. Et pour vraiment maîtriser ses outils, le meilleur moyen que j’ai trouvé c’est de les designer soi-même. Ils deviennent une extension de ta façon de penser. Ils rentrent chez toi.</p>

<hr />

<p>Bon. Les thèmes de couleurs.</p>

<p>J’ai eu une période où je changeais de thème Zed / Ghostty en espérant tomber sur le thème définitif. Des dizaines d’essais plus tard, deux ont retenu mon attention.</p>

<p>Le premier : Evergarden. Il a l’équilibre de couleurs qui me plaît le plus parmi tout ce que j’ai essayé.</p>

<p><img src="/images/buisson/preview.webp" alt="Evergarden preview" /></p>

<p>Evergarden est un thème Neovim créé par comfysage, maintenu aujourd’hui par l’organisation <a href="https://github.com/everviolet">Everviolet</a> sur GitHub. Sa base : <a href="https://github.com/sainnhe/everforest">Everforest</a>.</p>

<p>Everforest, c’est l’œuvre de Sainnhe Park. Au départ, le projet s’appelait “Forest Night” : un mix de deux thèmes verts de l’époque, vim-color-spring-night et sacredforest-vim. Un point de départ, pas encore un thème à part entière.</p>

<p>Avec le temps, la variante dark absorbe des influences de Gruvbox Material, une autre création de sainnhe. Une variante light apparaît. En mars 2021, le nom change : Forest Night devient Everforest. Sainnhe lui-même reconnaît que le projet est devenu autre chose.</p>

<p>La philosophie reste la même depuis le début : du vert, mais chaud. Du contraste, mais soft. Un thème fait pour protéger les yeux pendant les longues sessions, qui marche bien avec redshift et f.lux. Plus de 4 000 étoiles sur GitHub, des ports sur des dizaines d’éditeurs.</p>

<p>Evergarden reprend cette palette et y ajoute ses propres couches : des variantes saisonnières (winter, fall, spring, summer), une organisation inspirée de Catppuccin, une ambiance que leur repo résume avec “cozy morning coding”.</p>

<p>C’est ça que j’aime. Pas juste les couleurs, l’ambiance que ça crée. C’est difficile à expliquer rationnellement. Mes yeux aiment aller là.</p>

<p>Le second : <a href="https://stephango.com/flexoki">Flexoki</a>, de Steph Ango, l’homme derrière Obsidian. Steph a passé des années à travailler avec des encres et des pigments, et a voulu résoudre un problème difficile : redonner la sensation du papier à un écran émissif. Flexoki est le résultat de cette recherche.</p>

<p><img src="/images/buisson/flexoki-code.png" alt="Flexoki code" /></p>

<p>Le nom vient de la <a href="https://fr.wikipedia.org/wiki/Flexographie">flexographie</a>, un procédé d’impression industriel pour le papier et le carton.</p>

<p>L’encre sur papier est soustractive : on mélange des pigments qui absorbent la lumière. Un écran LCD ou OLED est additif : on additionne des lumières. Mélanger du bleu et du jaune en peinture donne du vert. En digital, ça donne un marron terne. Réduire l’opacité d’une couleur digitale la désature, alors qu’une aquarelle diluée reste vivante.</p>

<p>Sa principale référence : Solarized d’Ethan Schoonover (2011), un des premiers thèmes à avoir pensé en termes de relations de luminosité dans l’espace colorimétrique CIELAB. Steph a poussé ça plus loin avec l’espace Oklab, en augmentant l’intensité des couleurs de façon exponentielle pour simuler la vibrance des pigments dilués.</p>

<p>C’est le thème le plus abouti fonctionnellement que j’ai utilisé. Pensé pour la lisibilité, calibré pour la perception humaine, construit pour les sessions longues.</p>

<p>Du coup je naviguais entre les deux selon mon envie. Evergarden pour ses belles couleurs. Flexoki pour son accessibilité.</p>

<p>Tu le vois venir.</p>

<hr />

<p>J’ai décidé de faire le mix de ces deux mondes : de belles couleurs avec un maximum d’accessibilité.</p>

<p>C’est là que Buisson est né.</p>

<p>Le nom vient de là : les couleurs d’Everforest, oui. Mais aussi parce qu’un buisson c’est accessible. On peut tomber dessus sans trop se faire mal, s’y cacher, vivre dedans je suppose. J’aurais pu l’appeler Bush, mais il fallait cette dernière pointe de patriotisme 🇫🇷</p>

<p><img src="/images/buisson/Zed-pres.png" alt="Zed avec Buisson" /></p>

<hr />

<h2 id="palette">Palette</h2>

<p>Deux familles dans la palette. Les couleurs de base d’abord, qui couvrent tout ce qui n’est pas de la syntaxe : fonds, texte, numéros de ligne, commentaires. Puis les accents, les six couleurs botaniques qui colorent le code.</p>

<p>Toutes les accents ont un nom de plante ou de matière naturelle. Hibiscus, sage, river moss, slate sky, thistle, ochre. C’est volontaire : chaque nom contraint les décisions futures. Si une couleur ne peut pas s’appeler quelque chose de naturel, elle n’a pas sa place dans Buisson.</p>

<p><img src="/images/buisson/Theme dark.png" alt="Buisson dark" />
<img src="/images/buisson/Theme light.png" alt="Buisson light" /></p>

<h2 id="syntax-highlighting">Syntax highlighting</h2>

<p>La question centrale : quelle couleur va où, et pourquoi. Probablement ce que j’ai trouvé le plus dur à faire.</p>

<p>Trois niveaux de lecture.</p>

<p>Le niveau 1, c’est la structure du langage. Keywords et strings. Les deux éléments les plus présents dans n’importe quel fichier. Du coup ce sont eux qui reçoivent les couleurs les plus chaudes : hibiscus pour les keywords (<code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">def</code>, <code class="language-plaintext highlighter-rouge">for</code>, <code class="language-plaintext highlighter-rouge">return</code>), ochre pour les strings.</p>

<p>Le choix d’hibiscus sur les keywords vient directement d’Evergarden. Leur rose-rouge sur chaque ligne de structure crée cette chaleur enveloppante que j’aimais dans leur thème. Le code respire.</p>

<p>Le niveau 2, c’est la sémantique : ce que le code fait (fonctions en sage) et ce qu’il est (types en river moss). Le vert pour les fonctions, c’est une convention qu’on retrouve dans Tokyo Night, Catppuccin, la plupart des grands thèmes. Le teal pour les types, c’est architectural.</p>

<p>Le niveau 3, c’est le support. Opérateurs en thistle, nombres en slate sky, commentaires en <code class="language-plaintext highlighter-rouge">fg2</code> italique. Les commentaires en italique c’est non-négociable : c’est la convention pour dire “c’est une note, pas du code exécutable”. Les variables n’ont pas de couleur accent, juste <code class="language-plaintext highlighter-rouge">fg0</code>. Si tout est coloré, rien ne ressort.</p>

<p><img src="/images/buisson/capture-syntax-dark.png" alt="Syntax highlighting dark" />
<img src="/images/buisson/capture-syntax-light.png" alt="Syntax highlighting light" /></p>

<h2 id="base-colors">Base colors</h2>

<p>Le premier principe : aucun noir pur, aucun blanc pur.</p>

<p>Les backgrounds du mode sombre ont tous un undertone olive chaud. Le plus sombre, <code class="language-plaintext highlighter-rouge">bg0</code>, c’est <code class="language-plaintext highlighter-rouge">#181916</code>. Pas <code class="language-plaintext highlighter-rouge">#000000</code>. Pareil en clair : le fond principal c’est <code class="language-plaintext highlighter-rouge">#f5f1e8</code>. Du parchemin, pas du blanc éclatant.</p>

<p>C’est ça qui crée l’effet papier. Un blanc pur sur fond noir crée un halo rétinien. La fatigue après quelques heures de code vient souvent de là. Ajouter une teinte chaude aux fonds réduit ça sans sacrifier la lisibilité.</p>

<p>Neuf tokens, de <code class="language-plaintext highlighter-rouge">bg0</code> à <code class="language-plaintext highlighter-rouge">fg0</code> :</p>

<p><img src="/images/buisson/Nuances.png" alt="Nuances de base" /></p>

<p>Chaque token a un ratio de contraste calculé. <code class="language-plaintext highlighter-rouge">fg0</code> sur <code class="language-plaintext highlighter-rouge">bg1</code> donne 11.55:1, AAA selon WCAG 2.1. Les commentaires à 5.49:1, AA. Intentionnellement plus bas : un commentaire doit être lisible mais ne rivalise pas avec le code.</p>

<h2 id="accent-colors">Accent colors</h2>

<p>Six couleurs. Chacune existe en deux versions : une pour le mode sombre, une pour le mode clair.</p>

<p>Le problème classique des thèmes clairs : les accents calibrés pour un fond sombre sont trop lumineux sur fond clair. Du coup chaque couleur a sa paire, même hue, lightness ajusté pour tenir le ratio AA sur les deux fonds.</p>

<p><img src="/images/buisson/Accent.png" alt="Accents" /></p>

<p>Le processus de sélection a pris du temps. J’ai rejeté le goldenrod (trop jaune), le wild clove (trop proche d’hibiscus). River moss a dû être poussé vers H=180° en mode clair pour rester distinct du sage : à faible luminosité, deux verts séparés par 59° de hue se compriment et deviennent indiscernables. Ce genre de détail, tu ne le vois qu’en testant sur du vrai code, pendant des heures.</p>

<h2 id="ports">Ports</h2>

<ul>
  <li><a href="https://marketplace.visualstudio.com/items?itemName=adrius.buisson-theme">VS Code</a></li>
  <li><a href="https://zed.dev/extensions/buisson-theme">Zed</a></li>
  <li><a href="https://github.com/Adriusops/Buisson">Neovim</a></li>
  <li><a href="https://community.obsidian.md/themes/buisson">Obsidian</a></li>
  <li><a href="https://github.com/Adriusops/Buisson">Ghostty</a></li>
  <li><a href="https://github.com/Adriusops/Buisson">Alacritty</a></li>
  <li><a href="https://github.com/Adriusops/Buisson">Kitty</a></li>
</ul>

<p>L’architecture : un repo principal <code class="language-plaintext highlighter-rouge">buisson-theme</code> comme source de vérité, des repos satellites dédiés que je ne touche jamais directement, un GitHub Action qui synchronise automatiquement à chaque modification.</p>

<p>Chaque marketplace a ses propres contraintes. Zed exige un git submodule avec un ID qui ne contient pas le mot “zed”. Obsidian veut <code class="language-plaintext highlighter-rouge">manifest.json</code> et <code class="language-plaintext highlighter-rouge">theme.css</code> exactement à la racine d’un repo dédié. VS Code a son propre process via Open VSX.</p>

<p>Publier un thème, c’est plus compliqué que de le créer.</p>

<hr />

<p>Honnêtement, je ne crois pas que Buisson soit terminé. Les thèmes de couleurs ne le sont jamais vraiment.</p>

<p>Ce qui est sûr : c’est la première fois depuis longtemps que je n’ai plus envie d’en changer.</p>

<p>Ce blog tourne d’ailleurs sur Buisson — le fond crème, les accents rouges-rosés, les couleurs de code. C’est peut-être le meilleur test qu’un thème puisse passer : qu’on l’utilise pour construire les choses qu’on aime, et qu’on n’y pense plus.</p>]]></content><author><name>adrius</name></author><category term="essai" /><category term="design" /><category term="outils" /><category term="theme" /><category term="zed" /><category term="couleurs" /><category term="maker" /><category term="craft" /><summary type="html"><![CDATA[Comment Buisson est né : l'histoire d'un rabbit hole de customisation, de deux thèmes impossibles à choisir entre, et d'une décision d'en fusionner les meilleurs côtés.]]></summary></entry><entry><title type="html">Still. Devlog 003</title><link href="https://adrius.blog/posts/devlog-3-still/" rel="alternate" type="text/html" title="Still. Devlog 003" /><published>2026-06-22T00:00:00+00:00</published><updated>2026-06-22T00:00:00+00:00</updated><id>https://adrius.blog/posts/devlog-3-still</id><content type="html" xml:base="https://adrius.blog/posts/devlog-3-still/"><![CDATA[<p>Je réfléchissais à Sidekiq et à la fréquence des fetch des flux RSS. Toutes les heures ? Toutes les 6 heures ? Le calcul est simple : 10 sources par utilisateur, une requête HTTP par source, multiplié par le nombre d’utilisateurs. Même à quelques dizaines d’utilisateurs, ça reste négligeable.</p>

<p>Et puis j’ai buté sur un truc qui n’avait rien à voir avec la fréquence.</p>

<p>Si deux utilisateurs suivent le même blog, mon architecture allait fetcher ce blog deux fois. Une fois par utilisateur. À 100 utilisateurs qui suivent tous TechCrunch, ça fait 100 requêtes vers le même flux RSS, pour récupérer exactement le même contenu.</p>

<p>Ça m’a paru absurde. Les gros readers fetchent une source une fois, peu importe combien d’utilisateurs la suivent. Et je voulais que Still tienne cette logique dès la v1, pas comme un refacto douloureux à 1000 utilisateurs.</p>

<p>Je m’attendais à devoir retravailler pas mal de choses. Peut-être ajouter une notion de “source globale” séparée des sources de chaque utilisateur, migrer les données existantes, revoir les controllers. Le genre de chantier qu’on met sous le tapis.</p>

<p>Sauf qu’en regardant mon schéma, j’ai réalisé qu’il était déjà bon.</p>

<p><code class="language-plaintext highlighter-rouge">Source</code> n’a pas de <code class="language-plaintext highlighter-rouge">user_id</code>. Elle existe indépendamment. C’est <code class="language-plaintext highlighter-rouge">Subscription</code> qui fait le lien entre un <code class="language-plaintext highlighter-rouge">User</code> et une <code class="language-plaintext highlighter-rouge">Source</code>. J’avais construit ça en pensant au quota de 10 sources actives par utilisateur, pas à la question du fetch partagé. Mais le résultat est le même modèle qu’utilisent les gros readers : sources globales, abonnements individuels.</p>

<p>Ce qui devait changer, c’était juste la logique de création. Avant, <code class="language-plaintext highlighter-rouge">SourcesController#create</code> faisait ça :</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">current_user</span><span class="p">.</span><span class="nf">sources</span><span class="p">.</span><span class="nf">create</span><span class="p">(</span><span class="n">source_params</span><span class="p">)</span>
</code></pre></div></div>

<p>Ça créait systématiquement une nouvelle <code class="language-plaintext highlighter-rouge">Source</code>, même si l’URL existait déjà en base pour un autre utilisateur. Doublon en base, et doublon de fetch côté Sidekiq.</p>

<p>Le <code class="language-plaintext highlighter-rouge">create</code> devient :</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">source</span> <span class="o">=</span> <span class="no">Source</span><span class="p">.</span><span class="nf">find_or_create_by</span><span class="p">(</span><span class="ss">url: </span><span class="n">source_params</span><span class="p">[</span><span class="ss">:url</span><span class="p">])</span>
<span class="n">current_user</span><span class="p">.</span><span class="nf">subscriptions</span><span class="p">.</span><span class="nf">create</span><span class="p">(</span><span class="ss">source: </span><span class="n">source</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">find_or_create_by</code> cherche l’URL en base. Si elle existe, on récupère la source existante. Sinon on la crée. Dans les deux cas, on crée juste une <code class="language-plaintext highlighter-rouge">Subscription</code> qui relie l’utilisateur à cette source.</p>

<p>Le fetching RSS, dès qu’il sera branché sur Sidekiq, tournera par source, pas par utilisateur. Un blog suivi par 100 personnes sera fetché une seule fois.</p>

<p>Je me demande combien d’autres décisions que j’ai prises pour Still vont finir par résoudre des problèmes que je n’ai pas encore vus venir. Et combien, à l’inverse, vont me coûter cher plus tard sans que je le sache aujourd’hui.</p>]]></content><author><name>adrius</name></author><category term="devlog" /><category term="still" /><category term="rails" /><category term="architecture" /><category term="devlog" /><summary type="html"><![CDATA[le schéma qui scalait sans que je le sache]]></summary></entry><entry><title type="html">Still. Devlog 002</title><link href="https://adrius.blog/posts/devlog-2-still/" rel="alternate" type="text/html" title="Still. Devlog 002" /><published>2026-06-13T00:00:00+00:00</published><updated>2026-06-13T00:00:00+00:00</updated><id>https://adrius.blog/posts/devlog-2-still</id><content type="html" xml:base="https://adrius.blog/posts/devlog-2-still/"><![CDATA[<p><strong>There was a version of Still with three Moments: Sun, Moon, Flow.</strong> Sun for the active morning, Moon for night immersion, Flow for movement. I was proud of it. It was elegant on paper, consistent in <code class="language-plaintext highlighter-rouge">PRODUCT.md</code>, justified in <code class="language-plaintext highlighter-rouge">DECISIONS.md</code>.</p>

<p>But it was not necessary.</p>

<p>The problem wasn’t technical complexity. Two color palettes, adapted typography, specific transitions: that’s doable. The problem is that Sun and Moon asked the user to locate themselves in an energy level before they could read. Still was asking a question: <em>what state are you in?</em></p>

<p>That’s not a RSS reader’s job.</p>

<p>So I pulled the thread. If Still refuses unread counters, notifications, gamification, because all of that imposes a posture on the user before they’ve even opened the app, then Sun and Moon do exactly the same thing. They label the moment before the reader has had a chance to exist.</p>

<p>What’s left: a reading feed and Flow.</p>

<p>The feed composes content silently. A dense article, a short one, a tech source, then something else. The alternation is there but it’s unnamed. It’s not configurable. It exists because it’s the best way to read, not because the app decided it for you.</p>

<p>Flow is unchanged. It’s been the only voluntary gesture in Still since the start, and it stays that way.</p>

<p>My understanding of <a href="/posts/less-is-more/">“less is more”</a> changed doing this.</p>

<p>Before: remove features so the interface doesn’t get crowded.</p>

<p>Now: remove ideas you’re proud of because they contradict what you’re building. That’s different. The first is discipline. The second is honesty.</p>

<p>I don’t know yet if these were the right calls. I know Still is easier to describe today than it was yesterday. And usually, when a product gets easier to describe, that’s a good sign.</p>]]></content><author><name>adrius</name></author><category term="devlog" /><category term="still" /><category term="product" /><category term="devlog" /><category term="feature" /><category term="rss" /><summary type="html"><![CDATA[Sun and Moon mode are gone. What remains is more simple.]]></summary></entry><entry><title type="html">Less is more</title><link href="https://adrius.blog/posts/less-is-more/" rel="alternate" type="text/html" title="Less is more" /><published>2026-06-13T00:00:00+00:00</published><updated>2026-06-13T00:00:00+00:00</updated><id>https://adrius.blog/posts/less-is-more</id><content type="html" xml:base="https://adrius.blog/posts/less-is-more/"><![CDATA[<p>Less is more, fake it until you make it, carpe diem tatoué sur l’avant-bras de tonton. Des phrases souvent insupportables à entendre. Mais la première cache un concept réel.</p>

<p>L’idée : posséder moins pour apprécier plus. Ça s’applique à presque tout, le design, le code, ce qu’on crée, une semaine entière.</p>

<p>Concrètement : une feature en moins dans une app, celle qui ne sert pas l’objectif et perd l’utilisateur en route. Une activité en moins dans une semaine, celle qui prend trop de place par rapport à ce qu’elle apporte.</p>

<p>Le bénéfice est double.</p>

<p>D’abord on apprécie plus chaque chose qui reste. Moins de bruit autour, plus de place pour l’essentiel.</p>

<p>Ensuite on récupère de l’énergie. Chaque chose qu’on possède, chaque option qui existe, coûte une décision. Steve Jobs portait le même col roulé noir tous les jours, en partie pour ça. Réduire le nombre de choix sans impact, pour garder l’énergie décisionnelle pour ce qui compte.</p>

<p>Moins de possessions, moins de choix, moins de bruit. Plus d’attention pour ce qui reste.</p>

<p>Less is more n’est pas un renoncement. C’est un échange : moins de possessions contre plus d’attention disponible.</p>]]></content><author><name>adrius</name></author><category term="essai" /><category term="concepts" /><category term="minimalisme" /><category term="design" /><summary type="html"><![CDATA[Posséder moins pour apprécier plus, et récupérer l'énergie décisionnelle pour ce qui compte.]]></summary></entry><entry><title type="html">Still. Devlog 001</title><link href="https://adrius.blog/posts/devlog-1-still/" rel="alternate" type="text/html" title="Still. Devlog 001" /><published>2026-06-10T00:00:00+00:00</published><updated>2026-06-10T00:00:00+00:00</updated><id>https://adrius.blog/posts/devlog-1-still</id><content type="html" xml:base="https://adrius.blog/posts/devlog-1-still/"><![CDATA[<p>Le <a href="lien">devlog 000</a> racontait le pourquoi et la genèse de Still. Celui-ci raconte le comment : deux décisions de stack dont j’avais envie de garder la trace.</p>

<h2 id="revenir-à-ruby">Revenir à Ruby</h2>

<p>Je connais Ruby depuis quelques années. Le Wagon, des projets personnels, puis je suis passé à d’autres langages. Quand j’ai commencé Still, j’ai eu envie de retrouver ce langage.</p>

<p>Ce n’est pas une décision purement rationnelle. Ruby a une philosophie que j’aime beaucoup : le code doit être agréable à écrire et à lire, et cette agréabilité ne doit pas être un accident. Matz l’a conçu pour le bonheur du développeur. Ça se sent dans les idiomes, dans la lisibilité, dans la façon dont le code se lit quand il est bien écrit.</p>

<p>Du coup Rails s’est imposé naturellement. Still est une app CRUD classique : des sources, des articles, des utilisateurs, des sessions. C’est le terrain où Rails excelle. Les conventions sont fortes, l’écosystème est mature, Sidekiq pour le fetching RSS est natif à l’écosystème. Et le bottleneck d’un lecteur RSS, c’est le réseau, pas le CPU. Le GIL de Ruby ne sera jamais mon problème à cette échelle.</p>

<p>J’ai considéré Go et Node.js. Go m’aurait donné des performances brutes, mais un développement plus lent sans convention web. Node.js a une bonne gestion de l’I/O mais un écosystème fragmenté. Rails m’a donné ce dont j’avais besoin
réelle sans friction.</p>

<h2 id="choisir-react">Choisir React</h2>

<p>La séparation API-only + React m’est apparue rapidement.</p>

<p>La voie naturelle de Rails, c’est Hotwire : des templates ERB côté serveur, Turbo pour les mises à jour dynamiques. C’est solide, ça marche et pour la majorité des apps Rails, c’est le bon choix.</p>

<p>Mais Still n’est pas la majorité des apps Rails ;)</p>

<p>Still a une exigence de précision visuelle. Chaque transition, chaque animation, chaque geste dans l’interface doit être contrôlé. Hotwire est pensé pour des apps fonctionnelles et rapides à livrer. React me donne le niveau de contrôle que l’expérience de lecture exige. L’un n’est pas meilleur que l’autre en absolu. Mais pour ce que Still veut être, le choix était clair.</p>

<p>Honnêtement, c’est le seul argument qui compte. Still ne choisit pas React pour être moderne. Il le choisit parce que l’expérience qu’il veut construire ne peut pas exister autrement.</p>

<h2 id="ce-que-je-ne-sais-pas-encore">Ce que je ne sais pas encore</h2>

<p>Je rentre dans Rails 8 après quelques années d’absence. Ma compréhension des nouvelles conventions, des patterns qui ont évolué, n’est pas encore complète. Il y a des décisions que je vais probablement regretter en chemin.</p>

<p>C’est documenté dans le projet. Si les choix d’aujourd’hui se révèlent mauvais, au moins j’aurai la trace de pourquoi je les ai faits.</p>

<p>La prochaine question concrète : comment Sidekiq et le fetching RSS s’intègrent dans cette séparation backend/frontend. C’est là que l’architecture va commencer à se tester vraiment…</p>]]></content><author><name>adrius</name></author><category term="devlog" /><category term="still" /><category term="ruby" /><category term="rails" /><category term="react" /><category term="devlog" /><summary type="html"><![CDATA[Revenir à Ruby et choisir React]]></summary></entry><entry><title type="html">Des grands singes avec des téléphones</title><link href="https://adrius.blog/posts/grands-singes-avec-des-telephones/" rel="alternate" type="text/html" title="Des grands singes avec des téléphones" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://adrius.blog/posts/grands-singes-avec-des-telephones</id><content type="html" xml:base="https://adrius.blog/posts/grands-singes-avec-des-telephones/"><![CDATA[<p>Quand la vie devient d’une complexité violente, j’ai une phrase. Elle me permet de relativiser :</p>

<p><em>Nous sommes des grands singes avec des téléphones.</em></p>

<p>Des singes certes un peu plus intelligents que la moyenne, avec des outils fascinants, des angoisses élaborées et un sens aigu du regard de l’autre. Mais des singes. Des êtres sociaux, là pour une fraction de seconde à l’échelle du monde, qui se retrouvent à avoir honte de ce qu’ils font, à ne pas oser dire, à hésiter avant une décision qui est presque toujours moins grave qu’elle n’en a l’air.</p>

<p>La honte d’envoyer un message. L’hésitation avant une conversation difficile. La paralysie face à un choix. Le singe en face de toi, avec ses propres peurs et ses propres schémas, il improvise exactement comme toi.</p>

<p>Cette phrase ne supprime pas la complexité. Elle la remet à sa juste taille.</p>

<p>Affronter la remarque d’un collègue devient plus simple quand tu te rappelles que c’est un singe qui exprime quelque chose de sa propre confusion. Une décision difficile pèse moins quand tu intègres que, dans cent ans, la poussière de cette décision sera imperceptible. Se comprendre soi-même aussi : l’incohérence, la peur irrationnelle, le rejet. Bref, tout ce qu’on appelle “être humain” est assez logique quand on se rappelle d’où on vient.</p>

<p>On veut trop souvent se voir plus évolués qu’on ne l’est. Plus rationnels, plus maîtrisés. En fait, une bonne partie de ce qu’on appelle la complexité de la vie, c’est juste des singes sociaux qui naviguent leurs contradictions avec les outils qu’ils ont.</p>

<p>Admettre qu’on improvise n’est pas un échec. C’est ok.</p>]]></content><author><name>adrius</name></author><category term="essai" /><category term="philosophie" /><category term="légèreté" /><category term="vie" /><summary type="html"><![CDATA[Une incantation mentale pour affronter la complexité de la vie avec un peu moins de poids.]]></summary></entry><entry><title type="html">Still. Devlog 000</title><link href="https://adrius.blog/posts/devlog-0-still/" rel="alternate" type="text/html" title="Still. Devlog 000" /><published>2026-06-02T00:00:00+00:00</published><updated>2026-06-02T00:00:00+00:00</updated><id>https://adrius.blog/posts/devlog-0-still</id><content type="html" xml:base="https://adrius.blog/posts/devlog-0-still/"><![CDATA[<p>J’étais vraiment (trop) proche de l’addiction à YouTube.</p>

<p>Pas l’usage excessif : la vraie addiction. Recharger la page d’accueil en boucle sans avoir envie de rien en particulier, juste voir si quelque chose de nouveau était apparu. La récompense aléatoire. Remettre une pièce dans la machine, encore une fois, sans l’avoir décidé.</p>

<p><a href="https://www.bbc.com/news/technology-44640959">Aza Raskin</a>, l’inventeur du scroll infini, dit qu’il en est malade de regrets. Il a probablement contribué à détruire des milliards d’heures d’attention humaine. Il a inventé ça en une nuit pour un projet, sans savoir ce qu’il créait.</p>

<p>Mais quelqu’un savait. Quelqu’un a décidé que c’était exactement ce qu’il fallait déployer.</p>

<p>Ces algorithmes n’ont pas été conçus par des incompétents. Ce sont les meilleurs ingénieurs et psychologues du comportement humain au monde. Chaque détail est optimisé : la durée des pauses, la fréquence des récompenses, la friction d’arrêt quasi-nulle. Ce n’est pas un accident que tu ne puisses pas t’arrêter. C’est l’objectif.</p>

<p>Du coup j’ai voulu construire quelque chose.</p>

<p>Pas une appli de bien-être. Pas un tracker de temps d’écran. Quelque chose de plus fondamental : une app de lecture où je pourrais consommer tout ce qui m’intéresse, articles, vidéos, podcasts, de façon intentionnelle. Sans algo. Sans inbox qui se remplit pendant que tu dors. Sans cette sensation qu’il faut vider quelque chose.</p>

<p>En cherchant comment construire ça, j’ai redécouvert les flux RSS. Technologie des années 90, toujours vivante, complètement ignorée. Minimaliste, presque belle dans sa sobriété, et visiblement faite pour durer : le web a tout changé autour d’elle, elle est restée. Chaque blog, chaque chaîne YouTube, chaque podcast expose un flux RSS. Tu t’abonnes, tu reçois le contenu dans l’ordre chronologique : aucun algorithme au milieu, aucune curation étrangère. C’est le web tel qu’il aurait dû rester.</p>

<p>Le problème : aucune app existante ne les présente correctement. Elles recréent toutes la même inbox anxiogène, le même compteur de non-lus, la même logique du mail à vider. Et celles qui évitent ça le remplacent par un algorithme qui décide pour toi ce que tu vas regarder. La technologie est saine. L’expérience est cassée.</p>

<p>Still répare ça.</p>

<p>L’idée centrale tient en une phrase : tu ne peux jamais être en retard dans Still.</p>

<p>Il n’existe pas de dette de lecture. Pas de boîte à vider. Quand tu n’ouvres pas l’app pendant trois jours, rien ne s’accumule. Elle continue à préparer tes sessions en silence. Quand tu reviens, elle est prête. Sans un mot.</p>

<p>Tu ouvres Still. Tu lis. L’app a préparé une sélection depuis tes sources, avec l’obsession habituelle que je met sur le design pour que l’expérience soit la plus propre possible, alternant les registres et les longueurs. Quand tu pars, tu passes en mode Flow : l’app compose une session audio, tu scannes un QR code, tu poses ton téléphone dans ta poche.</p>

<p>Aucun compteur. Aucune notification non sollicitée. Aucune suggestion que tu n’as pas faite toi-même.</p>

<p>Je construis Still pour moi. J’en ai besoin et j’ai envie de l’utiliser tous les jours. Si ça peut aider d’autres personnes à avoir une relation différente avec leur consommation de contenu, j’en serai ravi.</p>

<p>Ce devlog documente la construction depuis le début. Les décisions, les frictions, ce qui marche et ce qui casse. Le code est <a href="https://github.com/Adriusops/Still">ouvert sur GitHub</a>. <a href="/posts/blog-init/">Le blog a changé de direction récemment</a>, ce projet est une partie du pourquoi.</p>

<p>Est-ce qu’on peut construire quelque chose qui résiste à ce que des milliards de dollars ont passé des années à optimiser ? Je ne sais pas encore. Mais ne pas reproduire les mêmes patterns me semble une bonne idée.</p>]]></content><author><name>adrius</name></author><category term="devlog" /><category term="devlog" /><category term="still" /><category term="rss" /><category term="product" /><summary type="html"><![CDATA[J'ai frôlé l'addiction à YouTube. Alors je construis Still une app de lecture sans algo, sans inbox, sans dette.]]></summary></entry><entry><title type="html">blog.init</title><link href="https://adrius.blog/posts/blog-init/" rel="alternate" type="text/html" title="blog.init" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>https://adrius.blog/posts/blog-init</id><content type="html" xml:base="https://adrius.blog/posts/blog-init/"><![CDATA[<h2 id="le-test-du-milliard">Le test du milliard</h2>

<p>Steph Ango a <a href="https://stephango.com/40-questions-decade">une liste de quarante questions</a> qu’il se pose tous les dix ans. Je suis tombé dessus par hasard.</p>

<p>La première : qu’est-ce que tu ferais si tu avais six mois à vivre ?</p>

<p>Honnêtement, celle-là ne m’a pas surpris. La réponse était évidente avant même d’avoir fini de la lire. Tu arrêtes de travailler. Tu passes du temps avec les gens que tu aimes. Tu fais tout ce que tu n’as pas encore eu le temps de faire. C’est humain, c’est universel, c’est ce que tout le monde dirait.</p>

<p>Mais la deuxième question était différente.</p>

<p>Qu’est-ce que tu ferais si tu avais un milliard ?</p>

<p>Là il n’y a plus de contrainte de temps. Plus d’urgence. Juste du temps, en quantité presque illimitée, sans aucune pression. Et je me suis rendu compte que ce que je voudrais faire de ce temps, c’est créer. Pas voyager indéfiniment, pas m’arrêter. Coder. Designer. Construire des expériences digitales sans la pression d’apprendre tel langage parce que les boites le veulent, sans devoir justifier mes choix techniques par un marché. Juste faire ce que j’aime, comme je l’aime.</p>

<p>C’est là que j’avais une dissonance.</p>

<p>Pas parce que les deux réponses se ressemblent. Parce que dans aucun des deux cas je ne me suis imaginé faire ce que je fais en ce moment. Pas de cloud security à apprendre pour décrocher un poste. Pas de certifications à préparer pour rassurer un recruteur. Pas de chemin raisonnable vers une liberté future hypothétique.</p>

<p>Juste créer. Maintenant.</p>

<p>Le problème que je prenais dans le mauvais sens depuis des mois.</p>

<hr />

<h2 id="le-mauvais-calcul">Le mauvais calcul</h2>

<p>J’avais une vision très précise de ce qu’était une carrière. Tu choisis une spécialité technique pointue. Tu l’apprends seul, en dehors des cours, parce que les cours ne suffisent pas. Tu accumules des compétences durement acquises jusqu’à atteindre un niveau qui te garantit un style de vie confortable, assez d’argent, assez de liberté, assez de temps pour enfin faire ce que tu aimes.</p>

<p>J’allais me spécialiser en cloud security exactement pour ça. Pas parce que ça me transcendait. Parce que c’est bien payé, ça s’apprend à distance, ça garantissait la liberté dont j’avais besoin pour être satisfait.</p>

<p>Le problème avec ce calcul : il suppose que j’arrive au niveau espéré. Et même si j’y arrive, il suppose que la liberté obtenue me laissera l’énergie et l’envie de créer ce que je voulais créer dès le départ.</p>

<p>C’est beaucoup de suppositions pour éviter de faire directement ce qu’on veut faire.</p>

<p>J’ai reconsidéré. Une carrière ce n’est peut-être pas un plan d’accès à une vie future. C’est peut-être juste ce qui se forme quand on fait ce qu’on aime avec assez d’obstination. Et même si l’opportunité ne suit pas exactement comme prévu, au moins on n’aura pas passé des années à préparer une vie qu’on ne vivra jamais vraiment.</p>

<hr />

<h2 id="le-signal">Le signal</h2>

<p>Ce que je veux faire, c’est créer des expériences digitales. Du design. Du logiciel. Des interfaces précises. Des choses belles qui fonctionnent exactement comme elles devraient fonctionner.</p>

<p>Je l’ai compris en finissant ce blog.</p>

<p>Pas en le publiant. En le finissant. Il y a eu un moment, tard dans la nuit, où j’ai regardé ce que j’avais construit et j’ai été ému. Pas fier. Ému. La page d’inspirations, la typographie, les espacements, le dark mode chaud. Tout semblait juste. Tout semblait moi.</p>

<p>Je ne pensais qu’à ça depuis des semaines. Et ce n’était pas malsain. C’était quelque chose qui m’habitait.</p>

<p>C’est ça le signal.</p>

<hr />

<h2 id="ce-qui-change">Ce qui change</h2>

<p>Donc ce blog va changer. Pas le design, il vient d’être fait avec une obsession que je n’aurais pas pu mettre sur autre chose. Pas le niveau d’exigence. Pas la voix.</p>

<p>Ce qui change : tout le sujet. Ce blog sera un journal de créateur. Les projets que je construis, les choses que j’apprends, les convictions que je me forme sur le craft, le design, les langages, les outils. Ce que ça fait de créer quelque chose de bout en bout et de le finir vraiment.</p>

<p>Le centre de gravité, c’est créer.</p>

<hr />

<h2 id="dans-dix-ans">Dans dix ans</h2>

<p>Steph Ango a <a href="https://stephango.com/40-questions-decade">une autre question</a> dans sa liste : qu’est-ce que tu espères qui sera pareil dans dix ans ?</p>

<p>Je n’avais pas de réponse immédiate à celle-là. Mais en écrivant cet article, j’en ai une.</p>

<p>L’obsession. Le fait que certaines choses m’habitent au point de ne plus penser à autre chose jusqu’à ce que ce soit fait, et bien fait. J’espère que ça ne changera pas.</p>

<p>Et si c’est le cas, le reste s’alignera.</p>]]></content><author><name>adrius</name></author><category term="essai" /><category term="craft" /><category term="code" /><category term="blog" /><summary type="html"><![CDATA[Deux questions posées par Steph Ango. Une réponse qui m'a frappé. Un blog qui change.]]></summary></entry></feed>