<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Brenner Cruvinel</title>
    <subtitle>AI researcher and product designer building at the edge of computer science and mental health.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://brennercruvinel.blog/en/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://brennercruvinel.blog"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-10T00:00:00+00:00</updated>
    <id>https://brennercruvinel.blog/en/atom.xml</id>
    <entry xml:lang="en">
        <title>My AirPods Max died and came back from the freezer</title>
        <published>2026-10-10T00:00:00+00:00</published>
        <updated>2026-10-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/meu-airpods-max-voltou-do-congelador/"/>
        <id>https://brennercruvinel.blog/en/blog/meu-airpods-max-voltou-do-congelador/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/meu-airpods-max-voltou-do-congelador/">&lt;p&gt;I&#39;m writing down what happened because I spent an entire day desperate over it, and maybe it helps someone going through the same thing.&lt;/p&gt;
&lt;p&gt;I have a pair of AirPods Max, the USB-C ones. For me they&#39;re not just headphones, the noise cancellation is what helps me function day to day. So when they stop working, it&#39;s not just annoying, it&#39;s genuinely heavy.&lt;/p&gt;
&lt;p&gt;They had fully drained before. Every time, I&#39;d charge them, reset them by holding the two buttons, and everything went back to normal. This time it didn&#39;t. I charged them, tried restarting, nothing. Then, trying to fix it, I did what seemed logical: I removed them from the device list on my Mac and iPad, thinking it would help pair them again. It didn&#39;t.&lt;/p&gt;
&lt;p&gt;Here&#39;s what was happening. I&#39;d hold the noise control button together with the crown for 15 seconds, which is &lt;a rel=&quot;external&quot; href=&quot;https://support.apple.com/en-us/119838&quot;&gt;Apple&#39;s official reset&lt;/a&gt;, and the light would blink three times in a reddish orange and the headphones would simply turn off. No matter how long I held it, nothing else lit up. To get any sign of life again, I had to put them in the case and take them out, and then the green light came on. If I held only the noise control button for about 5 seconds, a quick white flash appeared and vanished. It never stayed blinking white, which is pairing mode. I tried with the cable, without it, charged, near the Mac, far from it, everything.&lt;/p&gt;
&lt;p&gt;I spent hours digging into this with an AI, Claude, going through the Mac&#39;s Bluetooth logs. One thing I learned was why they used to come back on their own: the headphones and the Mac still kept the pairing key, so when they powered on again, they reconnected right away. This time, after so many resets, the key got wiped on the headphones, and on the Mac I wiped it myself when I removed them from the list. I really wanted to put them back on the list by hand, but there&#39;s no way. That key is created at pairing time, from random numbers generated by both devices, and it can&#39;t be rebuilt from the serial number or from any log. The headphones had to get into pairing mode, one way or another.&lt;/p&gt;
&lt;p&gt;Searching in English, I found the name of the problem: &lt;a rel=&quot;external&quot; href=&quot;https://9to5mac.com/2025/11/11/airpods-max-suffering-the-three-amber-lights-of-death-freezing-them-might-help/&quot;&gt;&quot;three amber lights of death&quot;&lt;/a&gt;. It&#39;s a known AirPods Max defect, the three amber blinks and no white light. The most common explanation is that the thin wires running through the ear cup hinges crack over time from all the rotating, or that the contacts between the headband and the cups pick up moisture. Apple has never explained the cause. And one of the fixes people reported was bizarre: put the headphones in the freezer.&lt;/p&gt;
&lt;p&gt;I had already tried everything, so I went for it. I put the headphones, without the case, inside a tightly sealed plastic bag and left them in the freezer for a few minutes. I took them out, did the procedure, and they blinked white. Paired instantly. Battery at 100%, firmware normal, everything working. I laughed alone out of sheer nerves.&lt;/p&gt;
&lt;p&gt;The logic, as far as I understand it, is that the cold makes the metal contract and temporarily closes a microcrack in the wire or improves a bad contact. That&#39;s why it wasn&#39;t the battery or the software, it was something physical. And that&#39;s also why it might come back. Some people went months without trouble, and for others it lasted only a few days.&lt;/p&gt;
&lt;p&gt;If you&#39;re dealing with the same problem, here&#39;s what I&#39;d say: before removing the headphones from every device and resetting them a thousand times, try the freezer, inside a well-sealed bag. When you take them out, have your phone or computer next to you and pair quickly. Then wait for them to get back to room temperature before charging, because &lt;a rel=&quot;external&quot; href=&quot;https://batteryuniversity.com/article/bu-410-charging-at-high-and-low-temperatures&quot;&gt;a lithium battery shouldn&#39;t be charged below 0 °C&lt;/a&gt;. And if the problem comes back, the next steps are cleaning the headband contacts with isopropyl alcohol or finding a repair shop to replace the hinge cable.&lt;/p&gt;
&lt;p&gt;And try not to let them drain to zero. From what I&#39;ve seen, this defect shows up exactly when they power back on after dying.&lt;/p&gt;
&lt;p&gt;Anyway, they came back. For now. And I learned more about Bluetooth in one day than in years.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Validating on disk the benchmark I wrote in the middle of the night</title>
        <published>2026-09-12T00:00:00+00:00</published>
        <updated>2026-09-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/validando-no-disco-o-benchmark-que-escrevi-de-madrugada/"/>
        <id>https://brennercruvinel.blog/en/blog/validando-no-disco-o-benchmark-que-escrevi-de-madrugada/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/validando-no-disco-o-benchmark-que-escrevi-de-madrugada/">&lt;p&gt;I opened a new session, with no context at all, and asked as if I were someone who had just cloned the repo: how do you use Nest, does it have an interface? The first command the answer suggested returned &lt;code&gt;command not found&lt;/code&gt; on my own machine. The second one showed a default model I was sure I had swapped out weeks earlier. Two holes no test catches, found in five minutes, and that&#39;s when I realized the topic of the week wasn&#39;t compression.&lt;/p&gt;
&lt;p&gt;The benchmark was just the place where it became visible. So, before publishing any number from the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/&quot;&gt;series&lt;/a&gt;, I spent a whole day validating: every number against the file on disk.&lt;/p&gt;
&lt;h2 id=&quot;what-was-wrong&quot;&gt;What was wrong&lt;/h2&gt;
&lt;p&gt;The first thing that didn&#39;t match wasn&#39;t even a number. I ran &lt;code&gt;strings&lt;/code&gt; on the release file and out came &quot;Spellbook MTG corpus&quot;. The file is called mtgdataset. The rename from a week earlier, which swapped Felipe&#39;s app name for the generic name in every text file, never made it into the binary. The lock next to the release described a file with the new name while the file had the old name inside, and no tool flagged it, because validation checks the file against itself. I rebuilt both releases with the right name inside, and the media bytes came out identical, which at least proved the encode is reproducible.&lt;/p&gt;
&lt;p&gt;The sizes of the three most aggressive builds were in mebibytes labeled as gigabytes. &lt;code&gt;du&lt;/code&gt; talks in MiB and I pasted it as GB. The difference is five percent per row, but the ratio inherits the error: the search build I had announced as 7.8 times smaller than the source is 7.5. The AVIF I said was 20% smaller than the recommended build is 13%. No conclusion changes, and it still made me ashamed, because it&#39;s the kind of mistake I&#39;d point out in someone else&#39;s report.&lt;/p&gt;
&lt;p&gt;The strangest one was the manifest of the AVIF build, which records a 21 GB source. The source is 4. I couldn&#39;t make sense of it until I divided by the number of cards: it gives the size of an uncompressed image, which is what the encoder receives midway through. The backend counted the intermediate instead of the JPEG. One line to fix, one test to write, and until then the ratio in that manifest was made up.&lt;/p&gt;
&lt;p&gt;And there&#39;s what can no longer be verified. I deleted the first full build when the disk filled up, so the sentence &quot;the three builds share the same hash&quot; is now two-thirds checkable. The CapCut experiment and the reprint matrix left no artifacts, only text. I told it to delete them myself, to free up space. Disk space is cheaper than trust and I should have known that.&lt;/p&gt;
&lt;h2 id=&quot;the-other-times-i-read-the-summary-and-not-the-file&quot;&gt;The other times I read the summary and not the file&lt;/h2&gt;
&lt;p&gt;The 200-card summary. I asked for the whole dataset, got a summary that talked about the corpus as if it were the corpus, and it was a pilot. I noticed with a meeting already scheduled. The agent didn&#39;t lie, it summarized the scope without saying so, and I read the summary instead of the disk. Since then every build delivery comes with validation of the real file, and this post exists for the same reason.&lt;/p&gt;
&lt;p&gt;My machine&#39;s paths. Days after the benchmark I found my home directory path in dozens of files headed for GitHub, inside manifests, locks, specs. The fix was an environment variable and a script that rewrites the sidecars before committing. And before that the agent had wanted to store my preferences in a local memory file. I asked it to delete it. If the workflow depends on what it remembers about my machine, it won&#39;t run in the next repo, and it won&#39;t run on the machine of whoever clones it.&lt;/p&gt;
&lt;p&gt;The five-gig repo. At some point I asked how ML engineers deal with this, because GitHub won&#39;t take it. The answer I adopted: not a single image byte goes into git. Each sample is a list of ids with the rule that generated it, and whoever has the SQLite database rebuilds the exact sample. The &lt;code&gt;.nest&lt;/code&gt; files go to Hugging Face with a hash alongside, and the repo keeps the lock, the clean manifest and the hash. The whole report is generated from each experiment&#39;s JSON, and a CI check fails if the markdown differs from the JSON. I can no longer paste a wrong number into a report without CI complaining, which is the kind of protection I needed against myself.&lt;/p&gt;
&lt;p&gt;The commits. The agent prefers one fat commit at the end of the day. I asked for sixteen, separate, with descriptions, because the history has to be readable for whoever comes later. And the plans: I rejected three in a row because they treated the model comparison as a footnote to a build already decided. The model list that exists in Nest today only exists because I insisted that research becomes a feature, never a footnote.&lt;/p&gt;
&lt;p&gt;What these episodes have in common is just one thing: in all of them I accepted a layer between me and the file. Summary, manifest, memory, fat commit. And the layer was wrong and didn&#39;t say so.&lt;/p&gt;
&lt;h2 id=&quot;what-i-ll-try-next-time&quot;&gt;What I&#39;ll try next time&lt;/h2&gt;
&lt;p&gt;Something that put me more at ease, in the middle of the validation, was finding out that the two findings I liked most already had names. The redundancy between images in a collection, which inter exploits, has been called set redundancy since &lt;a rel=&quot;external&quot; href=&quot;https://repository.lsu.edu/gradschool_disstheses/6258/&quot;&gt;Kosmas Karadimitriou&#39;s 1996 doctoral thesis&lt;/a&gt;, and the trick of lining images up as a pseudo-video has a decade of literature behind it. And the distinction between visual quality, vector stability and search usefulness, which I thought I had invented, is everyday business in the field the standards call coding for machines: it evaluates with task metrics, like mAP, precisely because &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2110.09241&quot;&gt;feature fidelity and task performance can drift apart&lt;/a&gt;. I didn&#39;t discover anything. I confirmed two things on a corpus nobody had looked at, and that makes me calmer about publishing than if it were something new.&lt;/p&gt;
&lt;p&gt;The 1.3 GB file is already in the pasta.cards repo, waiting for the screen that will use it. What&#39;s left of the benchmark fits in a paragraph: measure search with WeMM, build the full reprint corpus, decide whether AVIF becomes the default. None of the three has a date.&lt;/p&gt;
&lt;p&gt;What I&#39;ll try is the cheapest thing of all: open a clean session as a user before every release and type the first command in the readme. Five minutes, and it found two holes a week of agents didn&#39;t. I don&#39;t know if I&#39;ll remember to do it. But now it&#39;s written down, and I trust what&#39;s written more than what I remember.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Raising the CRF until search breaks</title>
        <published>2026-09-05T00:00:00+00:00</published>
        <updated>2026-09-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/subindo-o-crf-ate-a-busca-bugar/"/>
        <id>https://brennercruvinel.blog/en/blog/subindo-o-crf-ate-a-busca-bugar/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/subindo-o-crf-ate-a-busca-bugar/">&lt;p&gt;The question from the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/no-final-do-dia-ta-a-mesma-coisa-1-3-gb/&quot;&gt;previous night&lt;/a&gt; was simple to ask and I took my time asking it. The app keeps every card&#39;s JPEG cached for display. The &lt;code&gt;.nest&lt;/code&gt; doesn&#39;t need to be pretty, it needs to answer which card it is. So the CRF, the codec&#39;s quality setting, can go up until the vector breaks, and the vector breaks well after the eye does. If that were true, it would even be worth thinking about two tiers: a thumbnail inside Nest for search, and the full card on demand when the app needs to show it.&lt;/p&gt;
&lt;p&gt;I had a way to measure this, or thought I did. Nest&#39;s quality gate has two sides: a visual metric, which compares the decoded frame with the source, and vector drift, which measures how much the CLIP vector moves between the original image and the decoded one. The idea behind drift is that an image can look fine and still have moved in search space. I trusted that metric. It was mine, I had insisted on it in the plan, and for good reason: on dermoscopy it had caught a case where the image passed by eye and search by clinical text dropped by half.&lt;/p&gt;
&lt;h2 id=&quot;the-gate-rejected-the-whole-ladder&quot;&gt;The gate rejected the whole ladder&lt;/h2&gt;
&lt;p&gt;I took the visual side out of the gate and left only drift, with the floor Nest has used since dermoscopy. I had the CRF climb a ladder from 40 to 60. The gate rejected the whole ladder, including the first rung, and fell back to the most conservative one because it had nowhere else to go. Drift was already below the floor at CRF 40 and only got worse. And the visual metric, which I had taken out of the gate but kept computing, told the same story from another angle: from CRF fifty on it gave negative values on some cards, something I didn&#39;t even know it could do.&lt;/p&gt;
&lt;p&gt;The file the gate delivered, at CRF 40, the lowest on the ladder, came out close to one gig, four times smaller than the source. It was already smaller than the recommended build, and the gate had rejected it too, it just had nowhere lower to fall.&lt;/p&gt;
&lt;p&gt;By the gate&#39;s logic, none of these files was usable. I built one at CRF fifty anyway, no gate, just to see the size. Half a gig. Seven and a half times smaller than the source, and the cards turned into a blur, rules text unreadable, the art recognizable only from a distance. A file I wouldn&#39;t show anyone.&lt;/p&gt;
&lt;p&gt;Then I ran the metric that actually matters, which I hadn&#39;t run before because I was too lazy to set it up: search by name. A hundred queries like &quot;the art of such-and-such card&quot;, on the five files I had of the full corpus, from the 3.6 GB lossless one down to the half-gig blur. The first round gave zero hits on two of the five files, the lossless and the recommended one, and for a minute I thought I had broken search. It was the bench: it matched results by the card&#39;s position in the stream, and the two files with similarity sorting have a different order. Nest has a content id per item for exactly this, and once the bench matched on that, all five files answered again.&lt;/p&gt;
&lt;p&gt;And accuracy stayed within the noise on all of them. The half-gig file finds the right card as well as the 1.3 GB one, and both stay within the noise of the lossless file.&lt;/p&gt;
&lt;h2 id=&quot;search-survives-far-more-compression-than-the-eye&quot;&gt;Search survives far more compression than the eye&lt;/h2&gt;
&lt;p&gt;I stared at that on screen for a while. Cosine drift measures whether the vector moved. Search measures whether the vector still finds. I was using the first as if it were the second, and it would have vetoed a file that works. The vector does move, and it still stays closer to the right card than to any other. How far it travels doesn&#39;t matter if its neighbors don&#39;t change. A gate that&#39;s any good for this use needs hit@k as its floor, the fraction of queries where the right card shows up in the top k results, not cosine.&lt;/p&gt;
&lt;p&gt;That became a profile in Nest, &lt;code&gt;retrieval-only&lt;/code&gt;, which writes into the manifest that the file serves search and never display. And AVIF, which in the benchmark had come out about 12% smaller than AV1 at the same quality, held up on the full corpus: 13% smaller than the recommended build. It&#39;s the candidate to become the default backend for stills, and I haven&#39;t decided yet, because AVIF takes four to ten times longer to build and embed.&lt;/p&gt;
&lt;p&gt;There&#39;s a third metric I ran alongside that&#39;s worth nothing, and it&#39;s worth saying why. Identity: give the image itself as the query and see if it finds itself. It gave a hundred percent on every file, even the blur. Looks great and says nothing, because the query is the very image that produced the frame, and the uncompressed control also gives a hundred. It only proves the codec didn&#39;t destroy the data. I left it in the bench so nobody confuses pipeline stability with usefulness, which is exactly the confusion I made with drift.&lt;/p&gt;
&lt;p&gt;The metric is weak and I know it. It&#39;s a hundred queries with a model that does poorly on this corpus, CLIP, which only looks at the art. &quot;Didn&#39;t drop&quot; means &quot;I couldn&#39;t measure a drop&quot;, not &quot;it&#39;s the same&quot;. And WeMM, which reads the name printed on the card and gets nine in ten right, might suffer far more from the blur than CLIP, because what it reads is exactly what the CRF destroys first. I didn&#39;t measure it. That&#39;s next, along with the full reprint corpus, which is where inter has something to predict.&lt;/p&gt;
&lt;p&gt;What stuck with me that week was less about compression and more about what I choose to measure. I had a metric I designed myself, one that looked rigorous, and it answered a question I wasn&#39;t asking. And before publishing any of these numbers, I wanted to validate each one against the disk, because a report written in the middle of the night gets things wrong.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>At the end of the day it&#39;s the same thing, 1.3 GB</title>
        <published>2026-09-03T00:00:00+00:00</published>
        <updated>2026-09-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/no-final-do-dia-ta-a-mesma-coisa-1-3-gb/"/>
        <id>https://brennercruvinel.blog/en/blog/no-final-do-dia-ta-a-mesma-coisa-1-3-gb/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/no-final-do-dia-ta-a-mesma-coisa-1-3-gb/">&lt;p&gt;I was sure. Sorting the cards by similarity before encoding would multiply the compression, because similar neighboring frames are exactly what video codecs love. I had written it in the bets, I had repeated it to the agent, and the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/encoder-ignorou-o-tune-still-desde-o-primeiro-build/&quot;&gt;benchmark&lt;/a&gt; had handed me back a strange row: the variant with inter came out bigger than the one without. The configuration was wrong, scene cut detection was on, and different card after different card is one scene cut per frame. The encoder was burning cycles looking for a scene that didn&#39;t exist. I turned it off and put together a second corpus, almost three thousand real reprints of the same art, grouped together.&lt;/p&gt;
&lt;p&gt;That did it. With prediction in groups of sixteen frames, the file came out 29% smaller than without prediction. Groups of sixteen beat a single keyframe for the whole stream, which surprised me, and they still keep any card reachable by decoding at most sixteen frames. And a detail I didn&#39;t expect: shuffling the reprints instead of grouping them cost only two points. Part of the gain comes from the frame every card shares, not from the repeated art. The codec was exploiting the chrome, as I had suspected on day one, and that held for any order.&lt;/p&gt;
&lt;h2 id=&quot;building-the-whole-corpus-at-night&quot;&gt;Building the whole corpus at night&lt;/h2&gt;
&lt;p&gt;With 29% in hand, I built the full corpus with similarity sorting and prediction on, and next to it the same corpus with none of that, to compare. And I built it with the media inside the file, because by then I no longer accepted MP4s sitting next to the database. Before getting there I opened the folder of an intermediate build and found &lt;code&gt;.build&lt;/code&gt;, &lt;code&gt;.cache&lt;/code&gt;, &lt;code&gt;.forge-state&lt;/code&gt;, &lt;code&gt;.tmp&lt;/code&gt;, a lock, a manifest, all next to a &lt;code&gt;.nest&lt;/code&gt; of a few megabytes. What is all this for? I asked, and the honest answer was that every piece had a reason and none of them needed to be there once the build finished. Media inside the file was half the answer, the other half was cleaning up the output.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;.nest&lt;/code&gt; is a container of sections, each with its own hash. The new section is the simplest of all: a table of offsets and the raw bytes of the videos, glued one after another. An MP4 stays an MP4, nothing is re-encoded to fit. Opening the file doesn&#39;t touch the media, the system only maps the slice when someone asks for a card, and you can export the original MP4 back out with the hash checked before writing.&lt;/p&gt;
&lt;p&gt;That section doesn&#39;t count toward Nest&#39;s content hash, and this matters more than it seems. The content hash is computed over what&#39;s inside the file, not over the packaging, and it&#39;s what makes a Nest citation point to a piece of knowledge instead of a place on disk. The same corpus built with the media inside and with the media outside gives the same hash. It cost three percent: the indexes, the card text and the vectors add up to about forty megabytes on top of 1.3 GB of video.&lt;/p&gt;
&lt;p&gt;The builds ran overnight, and the night was rough. Two died with a full disk, because macOS was taking system snapshots in waves, eating and releasing gigabytes without warning, and at one point I was down to a hundred and thirty megabytes free. And in the middle of that I read a summary from the agent saying the corpus had 200 cards. I had a client meeting in a few hours.&lt;/p&gt;
&lt;p&gt;&quot;Seriously, you used 200 demo cards? I have a client meeting and I still don&#39;t have the dataset.&quot; I had it run validation on the 1.3 GB file. All 38 thousand blobs checked out, one by one. The corpus was complete, the summary was describing the pilot, and I had read the summary instead of the disk. After the encoder that wasn&#39;t using the tune the manifest claimed, it was the second time that week that what I read wasn&#39;t what was actually there.&lt;/p&gt;
&lt;h2 id=&quot;at-the-end-of-the-day&quot;&gt;At the end of the day&lt;/h2&gt;
&lt;p&gt;The sorted build sat next to the plain build. 1.3 GB both, no difference at all. I sent it to the agent at four in the morning: at the end of the day it&#39;s the same thing, right, 1.3 GB.&lt;/p&gt;
&lt;p&gt;The reason was in the manifest, correct this time. Nest decides per segment whether to use prediction, encoding a sample both ways. On the real corpus, made of unique cards, the probe vetoed prediction in every segment. There&#39;s nothing to predict: the next card is another card, with other art, and the shared chrome doesn&#39;t pay for the cost. The 29% gain only exists on the reprint corpus, and I haven&#39;t built that one in full yet.&lt;/p&gt;
&lt;p&gt;There was a worse part, which I only understood later. In an earlier version of the probe, it decided on bytes alone, and in a build of the sample it picked prediction for every segment because it tied on size. Median quality dropped sixteen points. The encoder compresses predicted frames with coarser quantization, and with unique cards a predicted frame is just a worse keyframe in disguise. Equal bytes aren&#39;t equal quality. The probe now measures both sides, accepts losing at most two points, and records the reason when it vetoes. The 29% matrix also compares bytes only, so the number is real but it isn&#39;t equivalent quality. I&#39;m putting that down here because I forgot it myself for a whole day.&lt;/p&gt;
&lt;h2 id=&quot;what-if-the-file-doesn-t-need-to-be-pretty&quot;&gt;What if the file doesn&#39;t need to be pretty&lt;/h2&gt;
&lt;p&gt;What I take from that night isn&#39;t the 1.3 GB. It&#39;s that my intuition about codecs was wrong twice, and that I read summaries when I should read files. Now I only turn sorting on when the corpus has near-duplicates, and no build goes in without validation of the real file running alongside it.&lt;/p&gt;
&lt;p&gt;And one question was left over that seemed more promising than any sorting. Nest&#39;s quality gate locks the codec at a conservative level because the visual metrics never pass on small cards with tiny print. But Felipe&#39;s app keeps every card&#39;s JPEG cached for display. The &lt;code&gt;.nest&lt;/code&gt; only needs to answer which card it is. If the file doesn&#39;t need to be pretty, how far can you push the setting before search starts complaining?&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The encoder had ignored tune=still since the first build</title>
        <published>2026-09-02T00:00:00+00:00</published>
        <updated>2026-09-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/encoder-ignorou-o-tune-still-desde-o-primeiro-build/"/>
        <id>https://brennercruvinel.blog/en/blog/encoder-ignorou-o-tune-still-desde-o-primeiro-build/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/encoder-ignorou-o-tune-still-desde-o-primeiro-build/">&lt;p&gt;The symptom was a number that didn&#39;t add up. I had a battery of encoders running in parallel: nineteen configurations across AV1, AVIF, x264, x265, WebP and lossy JPEG XL. Even VVC got in, more out of curiosity than hope. Each one calibrated to the same visual quality, to find out whether Nest&#39;s AV1 was the most compact option or just the one closest to home. One of the agents reproduced the Nest build by hand, with the same parameters, and the file came out a different size. Same card, same CRF, same preset, different bytes. I read that in the morning and my first reaction was that the agent had gotten the command wrong.&lt;/p&gt;
&lt;h2 id=&quot;the-probe-failed-and-nobody-said-a-word&quot;&gt;The probe failed and nobody said a word&lt;/h2&gt;
&lt;p&gt;It hadn&#39;t. The &lt;code&gt;forge&lt;/code&gt; asks the encoder for &lt;code&gt;tune=still&lt;/code&gt;, the still-picture mode, which is the right one for a stream where every frame is an independent photo. Before asking, it runs a probe to check whether the encoder accepts that mode. The probe ran without a parameter the mode requires, failed, and the code fell back to a generic mode without telling anyone. The manifest recorded the spec, which said &quot;still&quot;, not what the encoder had actually done. Since the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/&quot;&gt;first build&lt;/a&gt; I had been reading a manifest that didn&#39;t match the binary, and the only place that recorded the mode was the wrong place.&lt;/p&gt;
&lt;p&gt;The difference measured eleven points of visual quality for ten percent more bytes, at the same CRF. The old build was the worst point on the curve: smaller, but ugly in a way that isn&#39;t worth it. And nobody would have caught it by watching the video, because what a frame looks like in the player doesn&#39;t tell you which tune was used. Only bytes against the bytes of an independent encode.&lt;/p&gt;
&lt;p&gt;And it was by chance. The encoder battery existed to answer a different question, and the manual baseline encode was just its reference point. If I had calibrated the battery against the manifest instead of against an encode done from scratch, the bug would have stayed invisible, and every number in the series would have come out ten percent optimistic on bytes and eleven points pessimistic on quality. Now the manifest records the mode the encoder actually used, and the probe passes the right parameter.&lt;/p&gt;
&lt;p&gt;Even after the fix there was a second layer. SVT-AV1 has &lt;a rel=&quot;external&quot; href=&quot;https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Parameters.md&quot;&gt;two modes&lt;/a&gt; you could call &quot;still&quot;: &lt;code&gt;tune=2&lt;/code&gt;, optimized for a structural similarity metric, which is what the fixed probe started picking, and &lt;code&gt;tune=3&lt;/code&gt;, called image quality, which the documentation itself marks as still images only. The second one gives one more point of quality for one percent more bytes. Not much, but it&#39;s the right mode for still pictures, and the recommended build of the full corpus went out with it. The manifest now says which of the two, by number, because &quot;still&quot; on its own already fooled me once.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Variant on the same 2,048 cards&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th&gt;Visual quality&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;JPEG XL repack, lossless&lt;/td&gt;&lt;td&gt;1.12x smaller&lt;/td&gt;&lt;td&gt;same as source&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AV1 from the first build&lt;/td&gt;&lt;td&gt;3.3x smaller&lt;/td&gt;&lt;td&gt;52&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AV1 with tune=still&lt;/td&gt;&lt;td&gt;3.0x smaller&lt;/td&gt;&lt;td&gt;63&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AV1 with inter&lt;/td&gt;&lt;td&gt;2.5x smaller&lt;/td&gt;&lt;td&gt;62&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AVIF&lt;/td&gt;&lt;td&gt;5.5x smaller&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The AVIF row looks like the winner and it isn&#39;t. It sits at a much lower point on the quality curve, so you can&#39;t compare it on the same number. Calibrated to the same quality as AV1, it comes out about 12% smaller, and that left an open question about which backend to use for stills. And inter, my favorite bet, came out bigger than &lt;code&gt;tune=still&lt;/code&gt;. I explain that in the next post, because the configuration was wrong and the problem was something else.&lt;/p&gt;
&lt;p&gt;I won&#39;t table the rest of the nineteen, but three findings stayed with me. x264, the encoder for a 2003 standard, was the fastest inside the quality window by an enormous margin, and VVC, the newest codec on the list, cost a hundred times x264&#39;s time to land in the middle of the table.&lt;/p&gt;
&lt;p&gt;Two different SVT-AV1 presets spat out byte-for-byte identical streams, because the version I use maps both to the same internal mode when the stream is all keyframes. One more case of a parameter I was passing and the encoder was ignoring, this time documented. And lossy JPEG XL, which I expected to compete, only competes at high quality, well above the window that matters for a deck tile. It&#39;s a good codec for a target this corpus doesn&#39;t ask for.&lt;/p&gt;
&lt;h2 id=&quot;capcut-was-throwing-cards-away&quot;&gt;CapCut was throwing cards away&lt;/h2&gt;
&lt;p&gt;I had written in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/apostas-antes-de-comprimir-as-cartas/&quot;&gt;bets&lt;/a&gt; that speeding up the video cut bytes, because I had done it in CapCut and the file came out half the size. I reproduced it programmatically: speed it up sixty times, export at thirty frames per second in H.264, the way the editor does. The file came out with half the bytes. And half the cards.&lt;/p&gt;
&lt;p&gt;The export samples the sped-up timeline and drops whatever falls between one frame and the next. Of the 2,048 cards, 993 disappeared. What was left got re-encoded to H.264 on top of AV1 that was already lossy. CapCut didn&#39;t compress anything, it threw half the dataset away and called it optimization, and I looked at the file size and believed it. Changing only the fps, without speeding up, doesn&#39;t change a single byte. It&#39;s a timestamp annotation in the container, as &lt;code&gt;ffprobe&lt;/code&gt; had already told me on day one and I hadn&#39;t properly written down.&lt;/p&gt;
&lt;p&gt;The wrong bet yielded a real bug. With an fps other than one in the manifest, the code that fetches a frame by index asked for an instant that didn&#39;t exist, because it assumed ordinal and timestamp were the same thing. Fixed, and tested with the fps I never should have changed. The real gain CapCut was pointing at, redundancy between neighboring frames, does exist. It just has to be measured with inter, without losing cards, and that&#39;s the subject of the next late night.&lt;/p&gt;
&lt;h2 id=&quot;what-else-is-the-manifest-getting-wrong&quot;&gt;What else is the manifest getting wrong&lt;/h2&gt;
&lt;p&gt;I closed the day with two things validated by hash and a bigger doubt than when I started. The encoder mode was a constant I thought was on, and it had been off since the beginning. CapCut was a number I thought was compression, and it was data loss. Both lived in a manifest or an export I had read and accepted without checking against anything.&lt;/p&gt;
&lt;p&gt;If the encoder wasn&#39;t doing what the manifest said, the question left over was what else I was reading as a summary instead of validating on disk. I didn&#39;t know yet that the answer would come in the middle of the night, with a meeting on the calendar.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My bets before compressing the cards</title>
        <published>2026-09-01T00:00:00+00:00</published>
        <updated>2026-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/apostas-antes-de-comprimir-as-cartas/"/>
        <id>https://brennercruvinel.blog/en/blog/apostas-antes-de-comprimir-as-cartas/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/apostas-antes-de-comprimir-as-cartas/">&lt;p&gt;The compression can&#39;t lose anything, even if we have to invent it. I wrote that sentence in the plan, that confidently, after the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/&quot;&gt;first build&lt;/a&gt;. Two lines later I was saying lossless video with the cards sorted by similarity was a path, and further up I had dismissed &lt;code&gt;jpegtran&lt;/code&gt; because &quot;lossless doesn&#39;t count&quot;. I only noticed when I sat down to write the bets and had to define what I was going to measure, and measuring requires saying against what. Lossless relative to what? I had no answer. I had used the same word for three things and hadn&#39;t noticed.&lt;/p&gt;
&lt;h2 id=&quot;why-zstd-can-t-bite-into-a-jpeg&quot;&gt;Why zstd can&#39;t bite into a JPEG&lt;/h2&gt;
&lt;p&gt;A JPEG has already gone through three stages that exhaust the redundancy a general-purpose compressor knows how to find. The image becomes frequency coefficients, the high-frequency coefficients get rounded (that&#39;s where the loss happens), and the result goes through an entropy coder. What comes out is a bitstream where the repeated patterns have already been eaten. zstd looks for exactly that, repeated patterns. It&#39;s like trying to fold a sheet of paper that&#39;s already folded to the limit: it doesn&#39;t get smaller, it just crumples.&lt;/p&gt;
&lt;p&gt;So &quot;lossless&quot; on top of JPEG has three meanings, and only one deserves the name. The first is repacking the JPEG in a way where the inverse operation gives back the original file byte for byte. JPEG XL does this: it takes the already-rounded coefficients and rewrites them with a better entropy coder, keeping enough to undo it. The JPEG&#39;s loss is still there, but the packaging is tighter.&lt;/p&gt;
&lt;p&gt;The second is re-saving the same JPEG with &lt;code&gt;jpegtran&lt;/code&gt; or &lt;code&gt;jpegoptim&lt;/code&gt;. The pixels stay identical and the bytes change. Lossless for whoever looks, not for whoever checks the hash. And if the source is already optimized, like the files from Scryfall, the gain tends to zero.&lt;/p&gt;
&lt;p&gt;The third is what I was proposing without knowing it: decode the pixels and recompress them with another lossless codec, PNG, WebP, or FFV1 video. It looks like the purest meaning and it&#39;s the worst. The new codec receives pixels carrying the JPEG&#39;s rounding noise as if it were signal, and spends bits representing that noise faithfully. Everything points to the result being bigger than the source JPEG, not smaller. I wrote that and still didn&#39;t believe it, hence the bet.&lt;/p&gt;
&lt;p&gt;There&#39;s a fourth thing, which isn&#39;t a meaning but a gap. In 2016, a group from Tianjin University and Microsoft Research Asia published &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1109/TIP.2016.2551366&quot;&gt;&quot;Lossless Compression of JPEG Coded Photo Collections&quot;&lt;/a&gt;: they arrange a collection of JPEG photos as a pseudo-video, compensate the difference between neighboring photos, remove the remaining redundancy in the frequency domain, and still give back every original JPEG without losing a bit. Average savings above 31%. That&#39;s exactly what my invented idea wanted to be, done the right way. Except I couldn&#39;t find an open implementation, and I wasn&#39;t going to write a codec that week. So what I could measure was the ceiling with the tools that exist. The real ceiling, if that paper reproduces on Magic cards, is higher, and I want to say that before giving my number.&lt;/p&gt;
&lt;h2 id=&quot;what-i-bet-and-why&quot;&gt;What I bet and why&lt;/h2&gt;
&lt;p&gt;I wrote it down before running anything, because the last time I published a number without a written bet I had to correct it two days later, and correcting a published number is worse than losing a bet in public.&lt;/p&gt;
&lt;p&gt;Does lossy AV1 video compress much better than loose JPEGs? Yes, that&#39;s what the first build showed and what I had seen with dermoscopy. The more alike neighboring cards are, the more the video gains? Yes, and strongly: the database has 100 thousand printings for 52 thousand illustrations, almost half the cards repeat art that already exists on another, and they all share the same frame. If there&#39;s a video gain, it lives there.&lt;/p&gt;
&lt;p&gt;Does speeding up the video cut bytes? I had dropped one of the MP4s into CapCut, sped it up sixty times, and the file came out half the size. I bet yes, and if it&#39;s true it&#39;s the cheapest item on the list. Does tar plus zstd gain anything? I think not, for the reason in the section above. And does sorting by similarity help with unique cards too? I think not, I&#39;ve seen sorting do nothing on another dataset, but the shared frame leaves me unsure.&lt;/p&gt;
&lt;p&gt;And the one I wanted most: there&#39;s a lossless option better than JPEG, &quot;even if we invent it&quot;. After writing out the three meanings, I changed my mind halfway through the bet. The candidate became JPEG XL, and the lossless video sorted by similarity, the invented idea, is going to lose. The two I most wanted to be true, CapCut and lossless, were the two I could least defend. That&#39;s usually a sign.&lt;/p&gt;
&lt;p&gt;The lossless run went that same night, ten variants on the same 2,048 cards. Tar plus zstd came out one to one, exactly. Re-saving with &lt;code&gt;jpegtran&lt;/code&gt; gave less than one percent, the Scryfall JPEGs are already optimized. The ceiling was the JPEG XL repack, about 11% smaller, with all 2,048 original files rebuilt and validated by hash. Pushing the encoder effort to the maximum gives less than one percent more for six times the time, so the default stayed at medium effort.&lt;/p&gt;
&lt;p&gt;And the invented idea lost badly. FFV1 and x264 without quantization, with the cards sorted by similarity, came out three to four times bigger than the source JPEG. Sorting, in that regime, barely moved the size at all, a fraction of a megabyte on a file of hundreds. A decoded JPEG pixel carries noise and no codec predicts noise, just as I had written that morning without believing it.&lt;/p&gt;
&lt;p&gt;That became Nest&#39;s archive profile: anyone who won&#39;t accept losing anything gets the JPEG XL repack, 3.6 GB for the whole corpus, and every JPEG comes back bit for bit on request. It&#39;s not the number I wanted. It&#39;s the number I can defend with a hash, and I prefer that one. The other bets, the lossy ones, were running while I wrote this. The CapCut one, I was already afraid to look at.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Nest has the potential to be a Magic card archiver</title>
        <published>2026-08-31T00:00:00+00:00</published>
        <updated>2026-08-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/"/>
        <id>https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/">&lt;p&gt;Felipe Navarro, a friend of mine, is building &lt;a rel=&quot;external&quot; href=&quot;https://github.com/ofelipenavarro/pasta.cards&quot;&gt;pasta.cards&lt;/a&gt;, an open source app for managing your collection and Commander decks. It runs locally, keeps everything in SQLite, and to work offline it downloads the art of every Magic card ever printed, in two versions: the full card and just the illustration. On my Mac that came to 83 thousand JPGs and 7 GB. Every card that exists, twice, on my disk, and Finder dragging its feet to open the folder.&lt;/p&gt;
&lt;p&gt;What caught my attention in that number wasn&#39;t the size, disk is cheap. It was the structure. Cards share the frame, the text box, the typography, the mana symbols. And the database next to it shows that almost half of all printings reuse art that already appeared on another card. A loose JPG knows nothing about that. A good catalog points instead of copying, and a good codec doesn&#39;t spend bits on a pixel it can predict from its neighbor. I like both for the same reason.&lt;/p&gt;
&lt;p&gt;I had &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-vector-db-soberano/&quot;&gt;Nest&lt;/a&gt; at hand, the single-file vector database I&#39;ve been building this year, and since August it stores images too. The question I asked that morning was far more naive than everything that came after: how does it work, does it turn this into a video? I have 38 thousand images and a database, what does it do with them?&lt;/p&gt;
&lt;h2 id=&quot;does-it-turn-this-into-a-video&quot;&gt;Does it turn this into a video?&lt;/h2&gt;
&lt;p&gt;It really does turn it into a video. Each image becomes a frame of an AV1 stream inside the file, and search runs on vectors taken from the decoded frames, not from the source JPEG. That&#39;s on purpose: the index has to describe what the file serves, and what the file serves is the frame after the codec. Video codecs are the most optimized image compression technology there is, so what looks like a hack is just borrowing decades of other people&#39;s work.&lt;/p&gt;
&lt;p&gt;I had already measured this on skin. Dermoscopy, biopsy slides, pages of old books, the datasets I had on hand from my work at Hoff. What those numbers taught me is that how much something compresses is a property of the domain, not the codec. Same encoder, same settings: dermoscopy compressed 151 times and the book page compressed 4. Smooth skin compresses well because there&#39;s little detail to keep. Small print is the opposite, every edge costs bits.&lt;/p&gt;
&lt;p&gt;A Magic card has small print. It has the same frame on every card, which the codec may or may not exploit. It has reprints of the same art, something dermoscopy doesn&#39;t have. And it has a product constraint that no search metric measures: the deck tile has to look good on the app&#39;s screen. I thought the question was how much it compresses. It was, but not for long.&lt;/p&gt;
&lt;p&gt;Before running anything, I took a calmer look at the raw folder, and it had surprises of its own. Half the weight was the cropped version of the art, and my first idea was to throw it away and crop from the full card when needed. An agent read the app&#39;s code and came back with bad news: the database doesn&#39;t store any crop coordinates, and the app uses the crop directly in the deck tiles. The cropped art is a class of its own, not a derivative. And next to the image folder there was a directory called &lt;code&gt;_redundant&lt;/code&gt;, holding another seven gigs of copies of things that were already there. That one I deleted without mercy.&lt;/p&gt;
&lt;h2 id=&quot;the-first-build&quot;&gt;The first build&lt;/h2&gt;
&lt;p&gt;The pilot with a few hundred cards died with a segfault before doing anything. Nest&#39;s Python binding had been compiled without the flag that says &quot;use the process&#39;s Python, don&#39;t bring your own&quot;, and the Python I use is static, so two interpreters were fighting over the same memory. One flag and done. A small bug, and the kind that makes me suspicious: how many other environment assumptions does the build carry without declaring them?&lt;/p&gt;
&lt;p&gt;With the flag, the full build ran in the background and I opened one of the videos in the player. Cards going by, one per second, forty minutes of cards. My first hypothesis was that the encoder was repeating frames to hold each card on screen, and that this could be cut. One line of &lt;code&gt;ffprobe&lt;/code&gt; killed the hypothesis: one frame per card, and the duration is just a timestamp annotation in the container, it costs no bytes.&lt;/p&gt;
&lt;p&gt;7 GB became 1.9 GB, with image search working on top. It ran on the first try, which in a project of mine is rare enough to make me suspicious. Then I opened the output folder.&lt;/p&gt;
&lt;h2 id=&quot;an-archiver-with-38-mp4s-next-to-it-isn-t-an-archiver&quot;&gt;An archiver with 38 MP4s next to it isn&#39;t an archiver&lt;/h2&gt;
&lt;p&gt;38 video files, a &lt;code&gt;.nest&lt;/code&gt; with the indexes, a JSON manifest and a cache directory. Four kinds of file to serve one thing. Nest exists to be the database in one file, and what came out was a database with forty things next to it. It worked, the way a piece of furniture assembled with leftover screws works. The point of Nest was getting lost there, and compression wasn&#39;t even the problem. Nest has the potential to be an archiver for Magic cards, for maps, for any image dataset with a database beside it. But an archiver is a file, not a folder.&lt;/p&gt;
&lt;p&gt;The second question came from the model. The script used CLIP because that was what the &lt;code&gt;forge&lt;/code&gt; had, and I didn&#39;t really know what CLIP did with a card. I looked into it: it looks at the art and ignores the printed text. For a Magic card that means looking at the less useful half, because what identifies the card is the name written at the top. I asked for a search on Hugging Face and GitHub of the open multimodal models available that month, and the answer was a Tencent family called &lt;a rel=&quot;external&quot; href=&quot;https://huggingface.co/tencent/WeMM-Embedding-2B&quot;&gt;WeMM&lt;/a&gt;, which reads text inside images, plus SigLIP and Jina. I already had the two-billion-parameter WeMM downloaded for another reason.&lt;/p&gt;
&lt;p&gt;In a comparison with 1,500 cards and sixty queries like &quot;the art of such-and-such card&quot;, CLIP found the right card one time in four. WeMM got nine in ten, SigLIP came close, Jina landed in the middle. WeMM&#39;s price is being about thirty times slower than CLIP, and running it over the whole corpus would take almost a day on my machine. So the comparison stayed on the sample, and the full corpus kept CLIP for now.&lt;/p&gt;
&lt;p&gt;What came out of this wasn&#39;t &quot;switch to WeMM&quot;. It was that the model can&#39;t be a constant at the top of a script. It has to be a list of presets inside the engine, and whoever builds picks which one, or which ones, at build time. And the video has to fit inside the file, not next to it. Before either of those two things, I wanted to know how far I could compress without losing anything. Even if we had to invent it.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>GEO, schema and JSON-LD to get cited by LLM engines</title>
        <published>2026-05-20T00:00:00+00:00</published>
        <updated>2026-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/geo-schema-json-ld/"/>
        <id>https://brennercruvinel.blog/en/blog/geo-schema-json-ld/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/geo-schema-json-ld/">&lt;p&gt;I wrote this guide in May 2026, after putting what I knew about schema next to what the GEO (generative engine optimization) papers were measuring. On June 19 I applied it to this blog in three changes: the single @graph, the BreadcrumbList, and a bundle with speakable, a TL;DR block and a robots.txt that allows AI crawlers. So the example in this post is no longer a made-up &lt;code&gt;example.com&lt;/code&gt;. It is the JSON-LD this page serves right now.&lt;/p&gt;
&lt;p&gt;The idea that ties it all together: clean JSON-LD is no longer just crawler food. It is what generative engines read to decide who gets credit for an answer, and it is the format NLWeb consumes and returns.&lt;/p&gt;
&lt;h2 id=&quot;graph-and-id&quot;&gt;@graph and @id&lt;/h2&gt;
&lt;p&gt;The difference that matters is between loose JSON-LD blocks and a single connected graph. Each entity is declared once, with a stable &lt;code&gt;@id&lt;/code&gt;, and everything else points to it with &lt;code&gt;{ &quot;@id&quot;: &quot;...&quot; }&lt;/code&gt;. One &lt;code&gt;@graph&lt;/code&gt; block per page, not several scripts fighting each other.&lt;/p&gt;
&lt;p&gt;The anchoring rule I follow, in line with the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/w3c/json-ld-bp&quot;&gt;W3C JSON-LD best practices&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site-wide entities anchor at the root with a fragment: &lt;code&gt;/#organization&lt;/code&gt;, &lt;code&gt;/#website&lt;/code&gt;, &lt;code&gt;/#person&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Page entities anchor at the page URL: &lt;code&gt;#article&lt;/code&gt;, &lt;code&gt;#webpage&lt;/code&gt;, &lt;code&gt;#breadcrumb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The page entity references site entities by &lt;code&gt;@id&lt;/code&gt; and never copies the object&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I declare site entities before page entities. The W3C does not require it. It is hygiene: a linear parser resolves the nodes in the right order.&lt;/p&gt;
&lt;p&gt;The three bugs that show up most when auditing schema, all of which go away with disciplined &lt;code&gt;@id&lt;/code&gt; values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@id&lt;/code&gt; collision: two nodes with the same &lt;code&gt;@id&lt;/code&gt; get merged by the parser into one, with unpredictable results&lt;/li&gt;
&lt;li&gt;Orphan reference: an &lt;code&gt;@id&lt;/code&gt; that is referenced but does not exist in any node of the graph&lt;/li&gt;
&lt;li&gt;Plugin duplication: Yoast and RankMath each injecting their own Organization, with different data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The third one is the strongest argument for generating schema in one place. Here that place is &lt;code&gt;templates/partials/schema.html&lt;/code&gt;, a Zola partial that builds the whole graph from &lt;code&gt;config.toml&lt;/code&gt; and the post front matter.&lt;/p&gt;
&lt;p&gt;The other rule is triple agreement: visible text, semantic HTML and JSON-LD saying the same thing. The &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2509.10762&quot;&gt;GEO-16 paper&lt;/a&gt; audited 1,100 URLs cited by Brave Summary, Google AI Overviews and Perplexity, and the pillars most correlated with citation were metadata and freshness (r = 0.68), semantic HTML (r = 0.65) and structured data (r = 0.63). In other words, semantic HTML weighed as much as schema. Schema that describes something not on the page gets ignored, at best.&lt;/p&gt;
&lt;h2 id=&quot;the-graph-this-blog-serves&quot;&gt;The @graph this blog serves&lt;/h2&gt;
&lt;p&gt;This is the graph for the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/meu-airpods-max-voltou-do-congelador/&quot;&gt;AirPods Max&lt;/a&gt; post, without the long fields (description, image, word count):&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@context&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://schema.org&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@graph&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Organization&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#organization&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Brenner Cruvinel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;sameAs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://github.com/brennercruvinel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;knowsAbout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;artificial intelligence&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;mental health tech&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;product design&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;WebSite&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#website&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;inLanguage&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;pt-BR&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;publisher&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#organization&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#person&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Brenner Cruvinel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;sameAs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://github.com/brennercruvinel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;BlogPosting&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/blog/meu-airpods-max-voltou-do-congelador/#article&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;isPartOf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#website&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;headline&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Meu AirPods Max morreu e voltou do congelador&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;datePublished&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;2026-10-10T00:00:00+0000&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#person&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;publisher&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/#organization&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;speakable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;SpeakableSpecification&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;cssSelector&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.tldr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;BreadcrumbList&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/blog/meu-airpods-max-voltou-do-congelador/#breadcrumb&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;itemListElement&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;ListItem&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Home&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;ListItem&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Writings&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://brennercruvinel.blog/blog/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read it as an entity database, not as a list of tags. Organization, WebSite and Person exist once. The BlogPosting points to them. &lt;code&gt;speakable&lt;/code&gt; says which part of the HTML is good for direct extraction, here the TL;DR block at the top of every post.&lt;/p&gt;
&lt;p&gt;The template can also generate a Dataset node and a DefinedTermSet when a post&#39;s front matter declares &lt;code&gt;extra.dataset&lt;/code&gt; or &lt;code&gt;extra.terms&lt;/code&gt;. No post uses that yet.&lt;/p&gt;
&lt;p&gt;What is still missing here, and is commented out in &lt;code&gt;config.toml&lt;/code&gt;: the &lt;code&gt;sameAs&lt;/code&gt; to Wikidata (I do not have an entry there) and the SearchAction (the blog has no URL-based search).&lt;/p&gt;
&lt;h2 id=&quot;which-types-to-use&quot;&gt;Which types to use&lt;/h2&gt;
&lt;p&gt;The base shows up on almost every site: Organization or LocalBusiness for the brand, WebSite, WebPage per page, Person for authors and BreadcrumbList. On top of that:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Activity&lt;/th&gt;&lt;th&gt;Main types&lt;/th&gt;&lt;th&gt;Worth adding&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Blog, editorial site&lt;/td&gt;&lt;td&gt;Article, BlogPosting&lt;/td&gt;&lt;td&gt;SpeakableSpecification, Claim&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;E-commerce&lt;/td&gt;&lt;td&gt;Product, Offer, Review&lt;/td&gt;&lt;td&gt;Dataset for the catalog&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Local business&lt;/td&gt;&lt;td&gt;LocalBusiness&lt;/td&gt;&lt;td&gt;DefinedTerm for services&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SaaS, software&lt;/td&gt;&lt;td&gt;SoftwareApplication, Service&lt;/td&gt;&lt;td&gt;Dataset for the changelog&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Documentation&lt;/td&gt;&lt;td&gt;TechArticle, HowTo&lt;/td&gt;&lt;td&gt;DefinedTermSet&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Research&lt;/td&gt;&lt;td&gt;Article, Person&lt;/td&gt;&lt;td&gt;Claim, ClaimReview&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The types I think are underused:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DefinedTerm and DefinedTermSet register your own vocabulary that does not exist in Wikidata&lt;/li&gt;
&lt;li&gt;Dataset turns an article&#39;s metrics table into its own node, with &lt;code&gt;license&lt;/code&gt; and &lt;code&gt;temporalCoverage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Claim and ClaimReview mark statements and fact checks, useful for research content&lt;/li&gt;
&lt;li&gt;SoftwareSourceCode marks content as a technical reference&lt;/li&gt;
&lt;li&gt;VideoObject ties the video to the channel entity&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;where-schema-lives-on-each-platform&quot;&gt;Where schema lives on each platform&lt;/h2&gt;
&lt;p&gt;The principle does not change: the &lt;code&gt;@graph&lt;/code&gt; is a data artifact, not a UI artifact. It is serialized once from the source of truth and has to be where the consumer looks before any JavaScript runs. On the web, the consumer is a crawler reading the initial HTML, so JSON-LD comes from the server, never from a &lt;code&gt;useEffect&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The source of truth is the domain modeled as entities, with types validated in the backend language: Pydantic in Python, Zod or schema-dts in TypeScript, serde in Rust, Codable in Swift, kotlinx.serialization in Kotlin. Each entity has a stable internal identifier that becomes the &lt;code&gt;@id&lt;/code&gt;, and a single module generates the JSON-LD. That module is what kills duplication.&lt;/p&gt;
&lt;p&gt;In Next.js with the App Router, schema goes in a Server Component. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/google/schema-dts&quot;&gt;schema-dts&lt;/a&gt; is Google&#39;s types package, types only, with no runtime cost, and it had 3,127,725 downloads in the week of October 5 to 11, 2026, according to the npm API. Site entities go in the root layout; page entities in the page component. For a blog, SSG or ISR beats plain SSR, because the schema comes out at build time.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;tsx&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; app/blog/[slug]/page.tsx, Server Component&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; type&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; Graph&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; WithContext&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;schema-dts&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; ArticlePage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; params&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; post&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; getPost&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;params&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;slug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; schema&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; WithContext&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;Graph&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@context&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://schema.org&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@graph&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;      &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Article&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;      &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://example.com/blog/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;params&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;#article&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      headline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;title&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      author&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://example.com/#person&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      publisher&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;https://example.com/#organization&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      datePublished&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;publishedAt&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      dateModified&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;updatedAt&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #93A1A1);&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;application/ld+json&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #93A1A1);&quot;&gt;      dangerouslySetInnerHTML&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DC322F);&quot;&gt;{&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; __html&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;schema&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DC322F);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In a pure SPA, with Vite or CRA, the problem has no reliable solution: most AI crawlers do not run JavaScript. Static content goes in &lt;code&gt;index.html&lt;/code&gt;; dynamic content needs prerendering or a meta-framework with SSR. Rails, Django, Laravel and Go are the easy case: the server template prints the script.&lt;/p&gt;
&lt;p&gt;Rust on the server (axum, actix, Leptos with SSR) is the cleanest case, because the source of truth and the serializer are the same typed language:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;Serialize&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; Article&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;serde&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;rename &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; kind&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;serde&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;rename &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    headline&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    author&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; IdRef&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;     //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; { &amp;quot;@id&amp;quot;: &amp;quot;...&amp;quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    publisher&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; IdRef&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;serde&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;rename &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;datePublished&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; published&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; serde_json::to_string(&amp;amp;graph) becomes the body of &amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rust compiled to WebAssembly in the browser falls into the same hole as the SPA. If the wasm builds the page on the client, the crawler sees nothing. The article &lt;a rel=&quot;external&quot; href=&quot;https://www.gtechme.com/insights/webassembly-seo-future-challenges/&quot;&gt;The Future of SEO with WebAssembly&lt;/a&gt;, from the agency GTECH, argues the same: server-rendered HTML with text, headings and links on first load, and wasm only on top, for the heavy work.&lt;/p&gt;
&lt;p&gt;In a native app, Swift or Kotlin, there is no crawler reading the screen. Putting JSON-LD in a SwiftUI view gives you no visibility at all. What makes the content discoverable is the backend: it serves the same graph as HTML to crawlers and through a structured endpoint to agents, and the app consumes that backend. Firebase App Indexing, which indexed app content, is on Firebase&#39;s list of deprecated libraries; Android App Links and Universal Links are still useful, but they are routing, not discovery.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;/th&gt;&lt;th&gt;Where schema lives&lt;/th&gt;&lt;th&gt;How it gets there&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Next.js, Nuxt, SvelteKit, Astro, Zola&lt;/td&gt;&lt;td&gt;Server component, SSR or SSG&lt;/td&gt;&lt;td&gt;Script in the initial HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rails, Django, Laravel, Go&lt;/td&gt;&lt;td&gt;Server template&lt;/td&gt;&lt;td&gt;Script in the initial HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pure SPA&lt;/td&gt;&lt;td&gt;&lt;code&gt;index.html&lt;/code&gt; or prerender&lt;/td&gt;&lt;td&gt;Served HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rust on the server&lt;/td&gt;&lt;td&gt;serde in the handler&lt;/td&gt;&lt;td&gt;Script in the initial HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rust/wasm on the client&lt;/td&gt;&lt;td&gt;Prerender or SSR&lt;/td&gt;&lt;td&gt;Never client-only&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Swift, Kotlin, desktop&lt;/td&gt;&lt;td&gt;Backend the app consumes&lt;/td&gt;&lt;td&gt;Endpoint, &lt;code&gt;/ask&lt;/code&gt; and &lt;code&gt;/mcp&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Schema breaks silently. A structural change that corrupts an &lt;code&gt;@id&lt;/code&gt; only shows up weeks later, when the citations disappear. That is why it pays to validate before every deploy: the &lt;a rel=&quot;external&quot; href=&quot;https://validator.schema.org/&quot;&gt;Schema Markup Validator&lt;/a&gt; checks against the vocabulary, the &lt;a rel=&quot;external&quot; href=&quot;https://search.google.com/test/rich-results&quot;&gt;Rich Results Test&lt;/a&gt; checks the rich results that still exist, and schema-dts catches errors at compile time.&lt;/p&gt;
&lt;h2 id=&quot;faqpage-after-may-7-2026&quot;&gt;FAQPage after May 7, 2026&lt;/h2&gt;
&lt;p&gt;Google removed FAQ rich results in stages, announced in a notice in the documentation, with no blog post. On May 7, 2026 they stopped showing in search. On June 15 Google removed the feature&#39;s documentation, as the &lt;a rel=&quot;external&quot; href=&quot;https://developers.google.com/search/updates&quot;&gt;Search Central changelog&lt;/a&gt; records. The same announcement planned to drop support in the Search Console API in August.&lt;/p&gt;
&lt;p&gt;What remains: FAQPage is still a valid schema.org type. Google turned off the display, not the markup, and other crawlers keep reading it. What always did the work was the content in question-and-answer form.&lt;/p&gt;
&lt;p&gt;One number helps explain why. Ahrefs analyzed 863,000 queries and 4 million URLs cited in AI Overviews, in a study published in March 2026 and &lt;a rel=&quot;external&quot; href=&quot;https://www.searchenginejournal.com/google-ai-overview-citations-from-top-ranking-pages-drop-sharply/568637/&quot;&gt;summarized by Search Engine Journal&lt;/a&gt;: only 38% of the cited pages were in the top 10 for the same query. In the July 2025 version it was 76%, but Ahrefs itself warns that it improved citation detection between versions. Even with that caveat, what earns citations is not only what earns rankings.&lt;/p&gt;
&lt;p&gt;My decision: I keep FAQPage where the question and the answer are real and visible on the page. I remove it only where the section existed to decorate the SERP.&lt;/p&gt;
&lt;h2 id=&quot;nlweb-and-mcp&quot;&gt;NLWeb and MCP&lt;/h2&gt;
&lt;p&gt;NLWeb was &lt;a rel=&quot;external&quot; href=&quot;https://news.microsoft.com/source/features/company-news/introducing-nlweb-bringing-conversational-interfaces-directly-to-the-web/&quot;&gt;announced by Microsoft at Build 2025&lt;/a&gt; and was conceived by R.V. Guha, the same person behind RSS, RDF and Schema.org. Among the first partners named are Shopify, Snowflake, O&#39;Reilly, Tripadvisor, Eventbrite and Hearst. It turns a site into an MCP server with two endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/ask&lt;/code&gt; takes a natural language question and returns JSON in schema.org&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mcp&lt;/code&gt; exposes the same to agents, over the Model Context Protocol&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The arguments are the same for both; only the response format changes. The reference implementation keeps no state: the conversation context comes back with each call, in the &lt;code&gt;prev&lt;/code&gt; parameter or as an already decontextualized query.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;POST https://example.com/ask&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Content-Type: application/json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{ &amp;quot;query&amp;quot;: &amp;quot;who wrote about GEO on this site?&amp;quot;, &amp;quot;site&amp;quot;: &amp;quot;example.com&amp;quot; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The implication: a well-built &lt;code&gt;@graph&lt;/code&gt; becomes a conversational API without rewriting the backend. It works best on sites already structured as lists of items, recipes, events, products. The repository moved from &lt;code&gt;microsoft/NLWeb&lt;/code&gt; to &lt;a rel=&quot;external&quot; href=&quot;https://github.com/nlweb-ai/NLWeb&quot;&gt;nlweb-ai/NLWeb&lt;/a&gt; in July 2025. It is written in Python and now ships modules such as AskAgent, AgentFinder and DataFinder, with Postgres among the supported vector stores.&lt;/p&gt;
&lt;p&gt;For a native app with no web version, exposing &lt;code&gt;/ask&lt;/code&gt; and &lt;code&gt;/mcp&lt;/code&gt; over the data is the way to be found by agents.&lt;/p&gt;
&lt;h2 id=&quot;the-robots-txt-and-the-llms-txt&quot;&gt;The robots.txt and the llms.txt&lt;/h2&gt;
&lt;p&gt;If the goal is to be cited by AI, LLM user agents stay allowed in robots.txt. Blocking is a strategic decision, as with paid content, knowing it takes the site out of that channel. This blog&#39;s robots.txt allows, among others:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: GPTBot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: OAI-SearchBot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: PerplexityBot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: ClaudeBot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: Google-Extended&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: CCBot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GPTBot and OAI-SearchBot belong to OpenAI, PerplexityBot to Perplexity, ClaudeBot to Anthropic. Google-Extended controls use in Gemini and CCBot is Common Crawl.&lt;/p&gt;
&lt;p&gt;The llms.txt file is a markdown index of the important URLs. It blocks nothing and ranks nothing. Gary Illyes said in July 2025 that Google does not use it and does not plan to, and John Mueller compared the file to the keywords meta tag. On June 15, 2026 Google put this in its &lt;a rel=&quot;external&quot; href=&quot;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide#mythbusting&quot;&gt;own AI optimization guide&lt;/a&gt;: the file is not needed for search and neither helps nor hurts rankings. This blog has no llms.txt, and I do not plan to prioritize one.&lt;/p&gt;
&lt;h2 id=&quot;four-layers-for-an-llm-ready-engine&quot;&gt;Four layers for an LLM-ready engine&lt;/h2&gt;
&lt;p&gt;When schema stops being just SEO and becomes data for an LLM, I think in four layers.&lt;/p&gt;
&lt;p&gt;The first is content modeled as entities: types, fields, what null means, one stable identifier per entity, with source, update date and language recorded. It is the internal graph, independent of schema.org.&lt;/p&gt;
&lt;p&gt;The second is public exposure: the internal graph translated into schema.org, injected into the initial HTML, with triple agreement guaranteed.&lt;/p&gt;
&lt;p&gt;The third is RAG. Each chunk in the vector index carries the text, the entity&#39;s &lt;code&gt;@id&lt;/code&gt;, the type, the date and the language. The same identifier vocabulary everywhere lets the LLM stitch together a coherent answer across the JSON-LD, the documents and the API.&lt;/p&gt;
&lt;p&gt;The fourth is the application: tools with input and output schemas over the entities, the LLM in structured output, and the front end treating the answer as a view of the graph, always showing the source.&lt;/p&gt;
&lt;p&gt;What ties the four together is the same entity model in the JSON-LD, the backend, the tools and the front-end types. And it is worth logging when the LLM cites an entity by &lt;code&gt;@id&lt;/code&gt;, to compare with referrals from AI Overviews and ChatGPT after each schema change.&lt;/p&gt;
&lt;h2 id=&quot;what-the-papers-say-helps&quot;&gt;What the papers say helps&lt;/h2&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2311.09735&quot;&gt;original GEO paper&lt;/a&gt;, by Aggarwal and others, published at KDD 2024, tested content rewrites and measured visibility in the answers. The three methods that worked best were citing sources, adding direct quotations and adding statistics, with a relative gain of 30% to 40% on the position-adjusted word count metric. Citing other sources raises the chance that you get cited.&lt;/p&gt;
&lt;p&gt;The rest is the basics done well: answer at the top, short paragraphs, descriptive headings, a single H1, real &lt;code&gt;datePublished&lt;/code&gt; and &lt;code&gt;dateModified&lt;/code&gt;, and primary sources with links.&lt;/p&gt;
&lt;h2 id=&quot;checklist&quot;&gt;Checklist&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;A single &lt;code&gt;@graph&lt;/code&gt; block per page&lt;/li&gt;
&lt;li&gt;Organization, WebSite and Person declared once, anchored at the root with &lt;code&gt;#&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Page entities anchored at the URL, referencing site entities by &lt;code&gt;@id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Site entities before page entities&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sameAs&lt;/code&gt; to Wikidata on Organization and Person, when an entry exists&lt;/li&gt;
&lt;li&gt;&lt;code&gt;knowsAbout&lt;/code&gt; with the real topics of authority&lt;/li&gt;
&lt;li&gt;SpeakableSpecification pointing to the summary and the headings&lt;/li&gt;
&lt;li&gt;Dataset when there is a data table, with &lt;code&gt;license&lt;/code&gt; and &lt;code&gt;temporalCoverage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DefinedTerm for your own vocabulary&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dateModified&lt;/code&gt; updated on every real edit&lt;/li&gt;
&lt;li&gt;JSON-LD in the initial HTML; in a native app, through an endpoint&lt;/li&gt;
&lt;li&gt;Schema typed in the backend language&lt;/li&gt;
&lt;li&gt;Triple agreement between text, semantic HTML and JSON-LD&lt;/li&gt;
&lt;li&gt;AI user agents allowed in robots.txt&lt;/li&gt;
&lt;li&gt;Validation in the Schema Markup Validator and in CI&lt;/li&gt;
&lt;li&gt;NLWeb &lt;code&gt;/ask&lt;/code&gt; and &lt;code&gt;/mcp&lt;/code&gt; once the graph is stable&lt;/li&gt;
&lt;li&gt;llms.txt last, if at all&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pranjal Aggarwal et al., &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/3637528.3671900&quot;&gt;GEO: Generative Engine Optimization&lt;/a&gt;, KDD 2024&lt;/li&gt;
&lt;li&gt;Arlen Kumar and Leanid Palkhouski, &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2509.10762&quot;&gt;AI Answer Engine Citation Behavior: An Empirical Analysis of the GEO-16 Framework&lt;/a&gt;, 2025&lt;/li&gt;
&lt;li&gt;Mahe Chen et al., &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2509.08919&quot;&gt;Generative Engine Optimization: How to Dominate AI Search&lt;/a&gt;, 2025&lt;/li&gt;
&lt;li&gt;Junwei Yu et al., &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2603.29979&quot;&gt;Structural Feature Engineering for Generative Engine Optimization&lt;/a&gt;, 2026, which measured 17.3% more citations by changing only the structure of the content&lt;/li&gt;
&lt;li&gt;W3C, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/w3c/json-ld-bp&quot;&gt;JSON-LD Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/google/schema-dts&quot;&gt;schema-dts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nlweb-ai/NLWeb&quot;&gt;nlweb-ai/NLWeb&lt;/a&gt;, the NLWeb reference implementation&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Extraction attacks against black-box models: a reading list</title>
        <published>2026-04-08T00:00:00+00:00</published>
        <updated>2026-04-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/model-extraction-attacks/"/>
        <id>https://brennercruvinel.blog/en/blog/model-extraction-attacks/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/model-extraction-attacks/">&lt;p&gt;I put this list together for a security and intelligence research project. The first version was a dump of search results: the same Tramèr paper showed up eight times under different links, and half the items had nothing to do with model extraction. I deduplicated it, checked every source and removed what was off topic. What remains is what I would read again.&lt;/p&gt;
&lt;p&gt;The question that ties it together: if I can only query a model through an API, without seeing the weights, how much of it can be rebuilt? And, going the other way, how much of the training data can be recovered from the model or from its gradients?&lt;/p&gt;
&lt;h2 id=&quot;stealing-the-model-through-the-api&quot;&gt;Stealing the model through the API&lt;/h2&gt;
&lt;p&gt;The starting point is &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1609.02943&quot;&gt;Stealing Machine Learning Models via Prediction APIs&lt;/a&gt;, by Tramèr and colleagues, presented at USENIX Security 2016. They showed that cloud machine learning services, by returning prediction confidence, let an attacker rebuild models such as logistic regression and decision trees with few queries. The code is at &lt;a rel=&quot;external&quot; href=&quot;https://github.com/ftramer/Steal-ML&quot;&gt;ftramer/Steal-ML&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1602.02697&quot;&gt;Practical Black-Box Attacks against Machine Learning&lt;/a&gt;, by Papernot and colleagues, AsiaCCS 2017, is a close relative: it trains a substitute model by querying the target and uses that substitute to craft adversarial examples that transfer to the original.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1812.02766&quot;&gt;Knockoff Nets&lt;/a&gt;, by Orekondy, Schiele and Fritz, CVPR 2019, steals the functionality of an image network by querying it with random natural images. &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1609/aaai.v34i01.5432&quot;&gt;ActiveThief&lt;/a&gt;, by Pal and colleagues, AAAI 2020, does the same while choosing queries by active learning over unlabelled public data. &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.14722/ndss.2020.24178&quot;&gt;CloudLeak&lt;/a&gt;, by Yu and colleagues, NDSS 2020, uses adversarial examples to extract models from commercial services with fewer queries.&lt;/p&gt;
&lt;p&gt;More recent: &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2409.14122&quot;&gt;Efficient and Effective Model Extraction&lt;/a&gt;, by Zhu and colleagues, 2024, and &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1016/j.knosys.2024.112144&quot;&gt;A realistic model extraction attack against graph neural networks&lt;/a&gt;, by Guan and colleagues, in Knowledge-Based Systems 2024, which takes the problem to graph networks.&lt;/p&gt;
&lt;p&gt;The milestone for language models is &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2403.06634&quot;&gt;Stealing Part of a Production Language Model&lt;/a&gt;, by Carlini and colleagues, 2024. With API access alone, they recovered the final projection layer of production models and their hidden dimension.&lt;/p&gt;
&lt;p&gt;For the full map, the survey &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/3595292&quot;&gt;I Know What You Trained Last Summer&lt;/a&gt;, by Oliynyk, Mayer and Rauber, ACM Computing Surveys 2023, covers attacks and defences, and the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/kzhao5/ModelExtractionPapers&quot;&gt;kzhao5/ModelExtractionPapers&lt;/a&gt; repository keeps a list of papers in the area.&lt;/p&gt;
&lt;h2 id=&quot;inverting-the-model-and-leaking-through-gradients&quot;&gt;Inverting the model and leaking through gradients&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1906.08935&quot;&gt;Deep Leakage from Gradients&lt;/a&gt;, by Zhu, Liu and Han, NeurIPS 2019, is the paper that changed the conversation about federated learning: from the shared gradients, they rebuilt training images and text almost pixel by pixel.&lt;/p&gt;
&lt;p&gt;The ones that followed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2309.13016&quot;&gt;Understanding Deep Gradient Leakage via Inversion Influence Functions&lt;/a&gt;, by Zhang and colleagues, NeurIPS 2023, gives a way to analyse leakage without running the attack&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC10217429/&quot;&gt;Wasserstein Distance-Based Deep Leakage from Gradients&lt;/a&gt;, from 2023, changes the distance used in the reconstruction&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1186/s42400-024-00227-7&quot;&gt;Iterative and mixed-spaces image gradient inversion attack in federated learning&lt;/a&gt;, by Fang and colleagues, Cybersecurity 2024&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/3658644.3690292&quot;&gt;Uncovering Gradient Inversion Risks in Practical Language Model Training&lt;/a&gt;, by Feng and colleagues, CCS 2024, takes the attack to language model training&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2410.21453&quot;&gt;Inverting Gradient Attacks Makes Powerful Data Poisoning&lt;/a&gt;, by Bouaziz and colleagues, 2024, uses inversion to poison training&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1007/978-3-031-30648-8_1&quot;&gt;A Survey of the Implementations of Model Inversion Attacks&lt;/a&gt;, by Song and Namiot, 2023&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;weights-as-an-attack-surface&quot;&gt;Weights as an attack surface&lt;/h2&gt;
&lt;p&gt;If the attacker gets the weights file, extraction ends there. Two sides of that interest me.&lt;/p&gt;
&lt;p&gt;The first is the format. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/safetensors/safetensors&quot;&gt;safetensors&lt;/a&gt; exists because PyTorch&#39;s pickle format can execute code on load; safetensors stores only tensors. The &lt;a rel=&quot;external&quot; href=&quot;https://huggingface.co/blog/ngxson/common-ai-model-formats&quot;&gt;Hugging Face post on common formats&lt;/a&gt; compares safetensors, GGUF and others, and &lt;a rel=&quot;external&quot; href=&quot;https://github.com/justinchuby/onnx-safetensors&quot;&gt;onnx-safetensors&lt;/a&gt; connects ONNX to safetensors.&lt;/p&gt;
&lt;p&gt;The second is protecting the weights of frontier models. RAND&#39;s report &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.7249/RRA2849-1&quot;&gt;Securing AI Model Weights&lt;/a&gt;, from 2024, organizes the attack vectors and the security levels needed against each kind of attacker.&lt;/p&gt;
&lt;h2 id=&quot;what-was-left-out&quot;&gt;What was left out&lt;/h2&gt;
&lt;p&gt;The items from the original list on distributed training and sharding (FSDP), checkpoints, serving in general and neural networks applied to detecting vulnerabilities were removed. They are good, but they are not about model extraction. Also removed: B3, which is about backdoors, a 2025 adversarial attack unrelated to extraction, and the link to Carlini&#39;s talk at Virginia Tech, which now returns 404.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Image compression for computer vision: February&#39;s proposal and September&#39;s answer</title>
        <published>2026-03-12T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/compressao-imagem-computer-vision/"/>
        <id>https://brennercruvinel.blog/en/blog/compressao-imagem-computer-vision/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/compressao-imagem-computer-vision/">&lt;p&gt;In February 2026 I wrote a proposal for dermML&#39;s dermatology dataset, which was already stored as AV1 video: sort the images by visual similarity before encoding, so neighbouring frames would look alike and the codec could take advantage of it. I estimated compression would go from about 30 times to 50 to 80 times. I did not implement it at the time.&lt;/p&gt;
&lt;p&gt;In September I tested the same idea in Nest, with Magic cards, and it did not survive the real corpus. This post brings both ends together: what I was reading, what I proposed and what the data answered.&lt;/p&gt;
&lt;h2 id=&quot;what-i-was-reading&quot;&gt;What I was reading&lt;/h2&gt;
&lt;p&gt;Two readings convinced me that lossy compression of training data was safe and that video was a real dataset format.&lt;/p&gt;
&lt;p&gt;The first was a two-part series by Kaleigh Mentzer at Granica. In &lt;a rel=&quot;external&quot; href=&quot;https://www.granica.ai/blog/using-image-compression-to-improve-computer-vision-part-1&quot;&gt;part 1&lt;/a&gt;, from November 2023, Food101 classification with a Vision Transformer barely lost accuracy until compression went past about 70%, and segmentation models on Cityscapes could be trained on data compressed by 97%, using only 3% of the original storage, with no relevant drop in mIoU. Their explanation is that lossy compression throws away high frequencies first, and the model depends little on them too; in a test with 32 images, perturbing high-frequency DCT coefficients barely moved the prediction. In &lt;a rel=&quot;external&quot; href=&quot;https://www.granica.ai/blog/using-image-compression-to-improve-computer-vision-part-2&quot;&gt;part 2&lt;/a&gt;, with a fixed budget of about 0.5 GB, the original JPEGs fit 9,985 images, and compressing to Butteraugli distance 10 fit about 5.6 times more. With fewer than 100 images per class, more worse images beat fewer better ones by more than 10 accuracy points.&lt;/p&gt;
&lt;p&gt;The second was Hugging Face. In the &lt;a rel=&quot;external&quot; href=&quot;https://huggingface.co/blog/video-encoding&quot;&gt;post on encoding robotics datasets as video&lt;/a&gt;, from August 2024, datasets ended up at 14% of their original size on average, reaching 0.2% in the best case, and loading several consecutive frames took 25% to 50% of the time of loading the same frames from PNG. &lt;a rel=&quot;external&quot; href=&quot;https://huggingface.co/blog/lerobot-datasets-v3&quot;&gt;LeRobotDataset v3.0&lt;/a&gt;, from September 2025, went further: several episodes per file, metadata in Parquet and streaming straight from the Hub.&lt;/p&gt;
&lt;h2 id=&quot;the-proposal&quot;&gt;The proposal&lt;/h2&gt;
&lt;p&gt;The problem I saw in dermML was frame order. Images went into the video in file system order, alphabetical by name:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Frame 0: ISIC_0024306.jpg  (dark melanoma, light skin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Frame 1: ISIC_0024307.jpg  (benign nevus, dark skin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Frame 2: ISIC_0024308.jpg  (dermatofibroma, medium skin)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AV1 encodes a frame from its difference to a reference frame. If the neighbour is a different lesion on different skin, the difference is large and inter-frame prediction does not help. My reading was that the 30 times came almost entirely from compression inside each image.&lt;/p&gt;
&lt;p&gt;The idea: DermLIP embeddings, with 512 dimensions, already existed in the indexing pipeline. Finding the order that minimizes the distance between consecutive frames is a travelling salesman problem in embedding space, intractable to solve exactly for 58 thousand points, so the proposal used the simplest heuristic, greedy nearest neighbour:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;import&lt;/span&gt;&lt;span&gt; numpy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; as&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;from&lt;/span&gt;&lt;span&gt; sklearn&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;metrics&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pairwise&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; import&lt;/span&gt;&lt;span&gt; cosine_distances&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sort_by_visual_similarity&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;embeddings&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    order&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; visited&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; current&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; _&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; range&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;embeddings&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        dists&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span&gt; cosine_distances&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;embeddings&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; embeddings&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        dists&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;list&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;visited&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; float&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;inf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        current&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; int&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;argmin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dists&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        visited&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        order&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    return&lt;/span&gt;&lt;span&gt; order&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the estimate I wrote down:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Scenario&lt;/th&gt;&lt;th&gt;Estimated compression&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;File system order&lt;/td&gt;&lt;td&gt;~30x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sorted by similarity&lt;/td&gt;&lt;td&gt;~50 to 80x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sorted, with CRF and GOP tuning&lt;/td&gt;&lt;td&gt;~60 to 100x&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For the full dataset, that would take the 52 GB from something like 1.7 GB to somewhere between 650 MB and 1 GB. The proposal already called for &lt;code&gt;keyint=250&lt;/code&gt; and &lt;code&gt;scd=0&lt;/code&gt; in SVT-AV1, to turn off scene cut detection and avoid an extra keyframe at every new lesion, and for one more SQLite column to map each sorted frame back to its original image. The validation plan was to encode with and without sorting, compare size and quality, and check that search still found the same things.&lt;/p&gt;
&lt;h2 id=&quot;what-september-answered&quot;&gt;What September answered&lt;/h2&gt;
&lt;p&gt;In August Nest started storing images, and in September the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/&quot;&gt;Magic card series&lt;/a&gt; became the test I had not done in February.&lt;/p&gt;
&lt;p&gt;The first round with inter-frame prediction came out bigger than without it. The reason was exactly what the proposal had warned about: scene cut detection was on, and one different card after another is a scene cut on every frame. With it off, on a corpus of almost three thousand reprints of the same art, prediction made the file 29% smaller. Shuffling the reprints cost only two points, because part of the gain came from the frame every card shares. And that 29% compares bytes only, not equivalent quality.&lt;/p&gt;
&lt;p&gt;On the real corpus, of unique cards, the sorted build and the plain build came out at the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/no-final-do-dia-ta-a-mesma-coisa-1-3-gb/&quot;&gt;same 1.3 GB&lt;/a&gt;. Nest tests both ways per segment before deciding, and it vetoed prediction in all of them. There was nothing to predict: the next card is another card, with another artwork. In the lossless regime it was worse: FFV1 and x264 without quantization, with the cards sorted, came out &lt;a href=&quot;https://brennercruvinel.blog/en/blog/apostas-antes-de-comprimir-as-cartas/&quot;&gt;three to four times bigger&lt;/a&gt; than the source JPEGs, and sorting barely moved the size.&lt;/p&gt;
&lt;h2 id=&quot;what-remains&quot;&gt;What remains&lt;/h2&gt;
&lt;p&gt;The thesis from the readings still stands: training data tolerates a lot of compression, and video is a good dataset container. What fell was my extrapolation. Sorting by similarity only pays off when the corpus has near-duplicate images, like card reprints or consecutive robot frames. In dermoscopy, each image is a different lesion from a different person, and the estimate of 50 to 80 times was probably optimistic for the same reason as the card one.&lt;/p&gt;
&lt;p&gt;The other lesson is about method. Compression is a property of the domain before it is a property of the codec, and the only way to know is to encode the real corpus and look at the file, not the summary.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hoff MVP: blocking addiction sites in /etc/hosts</title>
        <published>2026-02-10T00:00:00+00:00</published>
        <updated>2026-02-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/hoff-mvp-bloqueio-hosts/"/>
        <id>https://brennercruvinel.blog/en/blog/hoff-mvp-bloqueio-hosts/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/hoff-mvp-bloqueio-hosts/">&lt;p&gt;Cleaning up the Hoff repository, I found the very first proof of concept. The goal was to block pornography sites and the like for a close friend who was struggling with this &lt;a href=&quot;https://brennercruvinel.blog/en/blog/vicios-dopaminergicos-digitais/&quot;&gt;addiction&lt;/a&gt;, which is silent and marginalized. It was the initial inspiration for everything. Finding it again was moving.&lt;/p&gt;
&lt;p&gt;It is the rawest MVP possible: no app, just the hosts file. The idea is to point the domain to loopback, so the computer tries to open the site on itself and finds nothing. And what matters most is keeping the way back, to restore the file when the block needs to come off.&lt;/p&gt;
&lt;h2 id=&quot;blocking&quot;&gt;Blocking&lt;/h2&gt;
&lt;p&gt;Each line in &lt;code&gt;/etc/hosts&lt;/code&gt; says &quot;this name resolves to this address&quot;. To block, the address is the machine itself:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;127.0.0.1   example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;127.0.0.1   www.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You need one line for each variation of the domain, with and without &lt;code&gt;www&lt;/code&gt;. On macOS, after editing, it is worth flushing the DNS cache so the change takes effect right away:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; dscacheutil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;flushcache&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; killall&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;HUP&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; mDNSResponder&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is an honest block, but a fragile one: anyone with the administrator password undoes it in seconds. Even so, it is one more bit of friction between the impulse and the click.&lt;/p&gt;
&lt;h2 id=&quot;restoring-hosts-on-macos&quot;&gt;Restoring hosts on macOS&lt;/h2&gt;
&lt;p&gt;Overwrites &lt;code&gt;/etc/hosts&lt;/code&gt; with the default macOS content:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; sh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;echo &amp;quot;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;# Host Database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;# localhost is used to configure the loopback interface&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;# when the system is booting.  Do not change this entry.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;127.0.0.1       localhost&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;255.255.255.255 broadcasthost&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;::1             localhost&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot; &amp;gt; /etc/hosts&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;restoring-hosts-on-windows&quot;&gt;Restoring hosts on Windows&lt;/h2&gt;
&lt;p&gt;Open PowerShell as administrator. This command appends the localhost entries to the end of the file, without deleting the rest:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Start-Process&lt;/span&gt;&lt;span&gt; powershell &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;-&lt;/span&gt;&lt;span&gt;Verb runAs &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;-&lt;/span&gt;&lt;span&gt;ArgumentList &lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Add-Content -Path C:\Windows\System32\drivers\etc\hosts -Value &amp;#39;127.0.0.1 localhost&amp;#39;, &amp;#39;::1 localhost&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To really remove the block, you need to overwrite the whole file, not just append:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Start-Process&lt;/span&gt;&lt;span&gt; powershell &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;-&lt;/span&gt;&lt;span&gt;Verb runAs &lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;-&lt;/span&gt;&lt;span&gt;ArgumentList &lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Set-Content -Path C:\Windows\System32\drivers\etc\hosts -Value &amp;#39;127.0.0.1 localhost&lt;/span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;`n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;::1 localhost&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Nest: a sovereign, content-addressable, offline-first vector DB</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/nest-vector-db-soberano/"/>
        <id>https://brennercruvinel.blog/en/blog/nest-vector-db-soberano/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/nest-vector-db-soberano/">&lt;p&gt;Sharing the concept of something I am working on, tired of hacking around vector DBs with no stability. In an ordinary database, a chunk&#39;s ID can change when the index is rebuilt, and a saved citation starts pointing somewhere else without telling anyone.&lt;/p&gt;
&lt;p&gt;Nest is my answer to that. It is a single-file vector DB, content-addressable, offline-first and hash-verified. Python builds the file, Rust serves the file. The address of any piece is:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nest://content_hash/chunk_id&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You cite by content, not by location. If the content changes, the hash changes, and it is impossible to receive something other than what you asked for.&lt;/p&gt;
&lt;h2 id=&quot;the-hash-as-the-address&quot;&gt;The hash as the address&lt;/h2&gt;
&lt;p&gt;The central idea is just one: the hash of the content becomes the address of the content. Instead of &quot;give me the file in such-and-such folder&quot;, which could have been swapped without you knowing, you say &quot;give me the file whose content has this hash&quot;. If something else came back, it would have a different hash. Verification is not an extra step; it is the very way you ask.&lt;/p&gt;
&lt;p&gt;In Nest, the two parts of the address play different roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content_hash&lt;/code&gt; identifies the whole file by the hash of what it contains&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chunk_id&lt;/code&gt; points to the piece inside that file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The practical consequence is the one I wanted: a citation does not break when the file moves to another folder, disk or machine. It is only valid for that content. If the content changed, the hash changed, and you know right away you are talking about something else.&lt;/p&gt;
&lt;h2 id=&quot;the-family&quot;&gt;The family&lt;/h2&gt;
&lt;p&gt;This is not my invention. It is content-addressable storage, and it has famous relatives.&lt;/p&gt;
&lt;p&gt;The most everyday one is Git. Each commit is identified by a hash of its content, and a &lt;code&gt;git commit&lt;/code&gt; is a sealed snapshot of the code at that moment. If someone rewrites history, the hashes do not match and Git flags it. IPFS does the same thing at scale, on a distributed network of many machines.&lt;/p&gt;
&lt;p&gt;Nest sits between the two:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;What it seals&lt;/th&gt;&lt;th&gt;What it is for&lt;/th&gt;&lt;th&gt;Scale&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Git&lt;/td&gt;&lt;td&gt;Code&lt;/td&gt;&lt;td&gt;Navigating versions&lt;/td&gt;&lt;td&gt;Repository&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;IPFS&lt;/td&gt;&lt;td&gt;Any file&lt;/td&gt;&lt;td&gt;Distribution&lt;/td&gt;&lt;td&gt;Network of machines&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nest&lt;/td&gt;&lt;td&gt;Vectorized knowledge&lt;/td&gt;&lt;td&gt;Search&lt;/td&gt;&lt;td&gt;One local file&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Same mechanism, different purpose. Of the analogies I collected, this is the only one that describes Nest without a metaphor: content addressing for the same reason, so that asking for the data and verifying the data are the same operation.&lt;/p&gt;
&lt;h2 id=&quot;shipping-versions-without-downloading-everything-again&quot;&gt;Shipping versions without downloading everything again&lt;/h2&gt;
&lt;p&gt;A file that never changes is great for citing and bad for updating. If every new version forces you to download the whole file, nobody updates.&lt;/p&gt;
&lt;p&gt;The most technical option is binary diffing. Tools like &lt;code&gt;bsdiff&lt;/code&gt;, &lt;code&gt;xdelta&lt;/code&gt; and the &lt;code&gt;--patch-from&lt;/code&gt; mode of &lt;code&gt;zstd&lt;/code&gt; compute the difference between yesterday&#39;s file and today&#39;s and produce a small patch. Whoever already has yesterday&#39;s version downloads only the patch and rebuilds today&#39;s locally, the same way an operating system updates without downloading everything again.&lt;/p&gt;
&lt;p&gt;The problem is that this only works if the format is append-friendly, meaning that adding content at the end does not mess up what was already there. A deterministic build that reorders things internally, and compressed, indexed formats tend to reorganize a lot, can produce a huge diff for a small change: you change one chunk, the whole index moves, and the patch is no longer small. That is why I think this route is more fragile than splitting the file into shards and shipping only the new shard. And you only find out by testing.&lt;/p&gt;
&lt;h2 id=&quot;beyond-the-hash&quot;&gt;Beyond the hash&lt;/h2&gt;
&lt;p&gt;The hash proves that something did not change. It does not prove who vouched for it or when the content existed. There are three known layers for that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Digital signatures and certificates, the same idea behind &lt;code&gt;https&lt;/code&gt; and signed software, which adds the &quot;who&quot;&lt;/li&gt;
&lt;li&gt;Trusted timestamping, such as the &lt;a rel=&quot;external&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc3161&quot;&gt;RFC 3161&lt;/a&gt; protocol or &lt;a rel=&quot;external&quot; href=&quot;https://opentimestamps.org/&quot;&gt;OpenTimestamps&lt;/a&gt;, which anchors the hash in Bitcoin and proves the content existed on a date without revealing the content&lt;/li&gt;
&lt;li&gt;Blockchain, which solves immutability with no central party to trust&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of the three, timestamping fits Nest best. Blockchain, for storing papers and citing passages, would be a sledgehammer to crack a nut: Nest wants content addressing and local verification, not consensus among machines that do not trust each other.&lt;/p&gt;
&lt;p&gt;In August, Nest started storing images too, and that became the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/nest-archiver-de-cartas-de-magic/&quot;&gt;Magic card series&lt;/a&gt;. More soon.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Prompt templates for research with agents</title>
        <published>2025-09-15T00:00:00+00:00</published>
        <updated>2025-09-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/templates-prompt-pesquisa-agentica/"/>
        <id>https://brennercruvinel.blog/en/blog/templates-prompt-pesquisa-agentica/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/templates-prompt-pesquisa-agentica/">&lt;p&gt;I&#39;ve been testing a few prompt templates that push crawlers and LLMs into delivering research more accurately. Sharing what I have, still in testing.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;WIP, template under test. Still tuning it, not a final version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The structure is always the same: role, objective, style, discovery sources, mandatory metadata and a benchmark rule. The most important line is the one that says to write &quot;no reliable public benchmarks&quot; instead of making up a number.&lt;/p&gt;
&lt;p&gt;And even with it, that&#39;s not enough. Variation A produced my &lt;a href=&quot;https://brennercruvinel.blog/en/blog/ecossistema-rust-open-source/&quot;&gt;survey of the Rust ecosystem&lt;/a&gt;. In 2026, when I checked every row of that table against the GitHub API, I found a repository that doesn&#39;t exist and a row pointing to the wrong project, one with a similar name. The prompt forbade making things up, and the agent made things up anyway. The template organizes the delivery, but the one who checks the result is still me.&lt;/p&gt;
&lt;h2 id=&quot;template-for-research-with-agents&quot;&gt;Template for research with agents&lt;/h2&gt;
&lt;p&gt;The prompts stay in Portuguese, exactly as I use them, because they ask the agent for output in Brazilian Portuguese. Variation A, the survey of Rust applications:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;papel: pesquisador sênior em ecossistema open source e linguagens de sistemas, foco pesado em rust.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;objetivo: mapear e analisar pelo menos 369 aplicações open source em rust, explicando por que cada uma importa, com metadados completos, contexto de adoção em produção e benchmark comparativo em tabela sempre que houver.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;estilo: pt-br, sem emoji, sem bullet no corpo principal (parágrafo e tabela), todo recurso citado como Nome + URL com link markdown clicável, cabeçalhos markdown.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fontes de descoberta: Awesome Rust, LibHunt Rust, OSS Insight, GitHub Stars Leaderboard, Github Ranking Top 100 Stars in Rust, listas &amp;quot;Rust in production&amp;quot; e &amp;quot;rust-in-production&amp;quot; (ImplFerris). priorizar alto número de stars/forks e atividade recente, uso em produção por empresa conhecida, diversidade de domínio (devtools, sistemas distribuídos, db, runtimes js/ts, ai infra, editores, cli, jogos, wasm, networking, segurança, observabilidade). evitar libs minúsculas ou experimentais salvo impacto desproporcional.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;metadados obrigatórios por app: nome, url do repo, descrição de 1 a 3 frases, categoria, subdomínio, maturidade, empresas que usam em produção, licença, stars/forks, crescimento 6 a 12 meses, data do último commit, número de contribuidores, &amp;quot;por que é foda&amp;quot; (2 a 4 frases).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;benchmark: pra cada projeto com benchmark público sério, colete tipo, contexto, setup (hardware, so, versão rust), comparação, números-chave com unidade, link da fonte. monte tabela por projeto: projeto, cenário, métrica, resultado, concorrente, resultado da concorrente, vantagem aproximada, link. sem benchmark crível, escreva &amp;quot;sem benchmarks públicos confiáveis&amp;quot;, nunca invente número. divergência entre fontes, explicite cenário, não consolide.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;organização: tabela geral com as 369+, mais tabelas por domínio (devtools, runtimes/plataformas, infra/observabilidade, terminais/shells/editores, web e apis, segurança/cripto/password managers, ai/ml infra, db e search, embedded/iot). análise final: distribuição por tipo, vantagem comparativa do rust, padrões técnicos (async/await/tokio, crates de observabilidade, arquiteturas), adoção corporativa vs go/c/c++/java/node, benchmark vs marketing, lacunas e oportunidades.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
&lt;summary&gt;Variation B: Rust + WebAssembly books and resources&lt;/summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;papel: pesquisador sênior em rust, wasm e desenvolvimento web de alta performance.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;objetivo: análise completa e atualizada de livros e recursos estruturados de rust + wasm, ecossistema global e contexto brasileiro, em tabelas com links clicáveis (livros, editoras, lojas, repos, doc oficial).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;estilo: idem variação A.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;escopo, cinco grupos: (1) livros-base de rust core relevantes pra wasm, com título, autor, ano, nível, temas, recomendação pra wasm, link oficial/compra/comunidade/repo. (2) livros específicos de rust + wasm, 20 a 30 obras, com tipo de recurso, público-alvo, escopo (browser/wasi/iot/mobile/desktop). (3) livros de wasm geral relevantes pra rust, com coluna &amp;quot;relevância pra rust&amp;quot;. (4) contexto brasil: traduções, autores brasileiros, livros específicos, disponibilidade real em e-book e loja br. (5) recursos oficiais e books online com profundidade de livro (the rust and webassembly book, doc de wasm-bindgen/web-sys/js-sys/wasm-pack/yew/leptos), com tipo, org, temas, link, repo, licença.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;análise final: pré-requisitos naturais antes de rust+wasm, quais livros são mais completos/atualizados/adequados por perfil (js dev migrando, rustacean avançado, dev de sistemas), como livros de wasm geral ajudam em performance/segurança/binário/interop, situação no brasil (lacunas e dependência de inglês), temas sub-representados (wasi, servidor, edge, frameworks modernos leptos/dioxus/tauri, segurança e fuzzing de módulos, casos além do browser).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Variation C: people and visualization projects in Rust + Wasm&lt;/summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;papel: pesquisador sênior em rust, wasm, visualização de dados e ecossistema open source.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;objetivo: mapeamento de pelo menos 50 pessoas relevantes em rust (foco rust+wasm) e pelo menos 50 projetos/libraries de grafos, charts e viz em wasm (idealmente rust, não exclusivamente), mais todos os links de presença online (github, site pessoal, redes, artigos, posts em dev.to e hacker news).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;estilo: idem, tabela como forma principal.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pessoas: nome completo, país/região, papel (autor, maintainer, contributor rustwasm, criador de framework, educador), 2 a 5 projetos principais, temas técnicos, github, site/blog, redes (twitter/x, mastodon, linkedin, youtube, twitch), páginas de autor (dev.to, medium, substack, conferências), discussões de destaque (hacker news, reddit r/rust, users.rust-lang.org). hubs de descoberta: awesome-rust, awesome-rust-and-webassembly, awesome-wasm, orgs rustwasm e bytecodealliance, github topics (topic:webassembly l:rust). validar que o link pertence à pessoa (evitar homônimo) e que o projeto é minimamente ativo.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;projetos: nome, descrição (2 a 3 frases), linguagem, tipo de viz (grafos, charts, heatmaps, mapas, dashboards, 2d, 3d), casos de uso, status, métricas (stars, contribuidores, downloads crates.io, uso citado), repo, site/docs, demos, artigos/talks/discussões.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;conexões: cruze pessoa↔projeto com nome, projeto, papel (criador, maintainer, core contributor, autor de módulo crítico), link de comprovação (readme de maintainers, palestra, artigo &amp;quot;introducing X&amp;quot;).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;contexto brasil (opcional): devs br relevantes com ênfase em viz/grafos, projetos br em rust com target wasm, conteúdo em português, talks em conferência br.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;análise final: núcleos de contribuição (rustwasm, bytecodealliance, empresas), clusters de viz (grafos, dashboards, jogos, ides, ferramentas científicas), perfis predominantes, lacunas (pouca bibliografia de grafos complexos, falta de tooling de alto nível, pouca doc pra iniciante), global vs brasil.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Claude Code slash command framework ended up on Chinese blogs</title>
        <published>2025-08-06T00:00:00+00:00</published>
        <updated>2025-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/claude-code-framework-repercussao/"/>
        <id>https://brennercruvinel.blog/en/blog/claude-code-framework-repercussao/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/claude-code-framework-repercussao/">&lt;p&gt;Wow. The number of Chinese blogs and sites writing about my slash command framework for Claude Code. The world is getting really strange, I never imagined a few markdown commands would ripple out like this.&lt;/p&gt;
&lt;p&gt;It&#39;s a simple idea, almost silly: slash commands written in markdown for Claude Code, open source, to automate the boring, repetitive part of the dev workflow. It&#39;s called &lt;a rel=&quot;external&quot; href=&quot;https://github.com/brennercruvinel/CCPlugins&quot;&gt;CCPlugins&lt;/a&gt;. I made it for myself, to stop repeating the same instructions all the time, like asking it to &quot;act like a senior engineer&quot; in every conversation. I published it at the end of July, and within days it started popping up in posts I can&#39;t even read without a translator.&lt;/p&gt;
&lt;p&gt;Most are Chinese, on Zhihu and CSDN, the two biggest developer communities there. Plus a few in English, on Medium and in tool newsletters.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Publication&lt;/th&gt;&lt;th&gt;Platform&lt;/th&gt;&lt;th&gt;Language&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://zhuanlan.zhihu.com/p/1937918597704947462&quot;&gt;Zhihu column&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Zhihu&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.zhihu.com/question/29451232&quot;&gt;Zhihu question&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Zhihu&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://blog.csdn.net/Trb201013/article/details/151188647&quot;&gt;CSDN, Trb201013&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CSDN&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://blog.csdn.net/weixin_42616808/article/details/150706512&quot;&gt;CSDN, weixin_42616808&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CSDN&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://blog.csdn.net/u012094427/article/details/149755651&quot;&gt;CSDN, u012094427&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CSDN&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://modelengine.csdn.net/690b1e985511483559e27576.html&quot;&gt;CSDN ModelEngine&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CSDN&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.ddli.cn/2866.html&quot;&gt;ddli.cn&lt;/a&gt;&lt;/td&gt;&lt;td&gt;ddli&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://jishuzhan.net/article/1959572729157431298&quot;&gt;JishuZhan&lt;/a&gt;&lt;/td&gt;&lt;td&gt;JishuZhan&lt;/td&gt;&lt;td&gt;zh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.blog.brightcoding.dev/2025/08/05/commands-for-automating-claude-code-cli-tasks-and-dev-workflows/&quot;&gt;Bright Coding&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Bright Coding&lt;/td&gt;&lt;td&gt;en&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://medium.com/@joe.njenga/i-discovered-this-claude-code-framework-that-automates-your-boring-stuff-d1d0ff9eb525&quot;&gt;Joe Njenga, on Medium&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;en&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://medium.com/coding-nexus/automate-your-claude-code-cli-using-ccplugins-1d484e431bf1&quot;&gt;Coding Nexus, on Medium&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;en&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.everydev.ai/p/tool-ccplugins-for-claude-code&quot;&gt;EveryDev&lt;/a&gt;&lt;/td&gt;&lt;td&gt;EveryDev&lt;/td&gt;&lt;td&gt;en&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;What gets me isn&#39;t the count, it&#39;s the distance. Something I wrote for myself turned into articles in Mandarin that I need machine translation to understand. Slash commands in markdown, that&#39;s all. Sometimes the simplest idea is the one that travels furthest, and I&#39;m still processing seeing my name in the middle of characters I can&#39;t read.&lt;/p&gt;
&lt;p&gt;Update, October 2026: the repository reached 2,776 stars and 167 forks, and it&#39;s archived today. Anthropic itself kept adding to Claude Code things the commands used to do by hand, subagents, context memory, and several of them became redundant. I think that&#39;s good. That&#39;s what they existed for.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The open source Rust ecosystem: what runs in production</title>
        <published>2025-06-30T00:00:00+00:00</published>
        <updated>2025-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/ecossistema-rust-open-source/"/>
        <id>https://brennercruvinel.blog/en/blog/ecossistema-rust-open-source/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/ecossistema-rust-open-source/">&lt;p&gt;I put this survey together with the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/templates-prompt-pesquisa-agentica/&quot;&gt;research templates for agents&lt;/a&gt;, to decide what to bet on in my Rust projects. The first version had a good rule, &quot;a benchmark number only goes in with a source&quot;, that it did not follow itself: several sources were just a site&#39;s home page, with no article, and the stars came rounded from third-party rankings.&lt;/p&gt;
&lt;p&gt;All stars below were read from the GitHub API on 13 October 2026.&lt;/p&gt;
&lt;h2 id=&quot;the-core-by-stars&quot;&gt;The core, by stars&lt;/h2&gt;
&lt;p&gt;Repositories with more than 20 thousand stars where Rust is the main language, according to GitHub. Where a description carries a performance number, it is what the project itself claims in its README.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/openai/codex&quot;&gt;openai/codex&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129,042&lt;/td&gt;&lt;td&gt;OpenAI&#39;s coding agent that runs in the terminal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustdesk/rustdesk&quot;&gt;rustdesk/rustdesk&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;125,720&lt;/td&gt;&lt;td&gt;Self-hosted remote desktop, client and server&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-lang/rust&quot;&gt;rust-lang/rust&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;119,904&lt;/td&gt;&lt;td&gt;The language&#39;s compiler and standard library&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tauri-apps/tauri&quot;&gt;tauri-apps/tauri&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;111,870&lt;/td&gt;&lt;td&gt;Desktop apps with a web front end and a Rust back end, smaller binaries than Electron&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/denoland/deno&quot;&gt;denoland/deno&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;108,774&lt;/td&gt;&lt;td&gt;JavaScript and TypeScript runtime, secure by default, with explicit permissions&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/oven-sh/bun&quot;&gt;oven-sh/bun&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;96,222&lt;/td&gt;&lt;td&gt;JavaScript runtime, bundler and test runner in one binary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/zed-industries/zed&quot;&gt;zed-industries/zed&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;91,688&lt;/td&gt;&lt;td&gt;Native editor with collaborative editing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/astral-sh/uv&quot;&gt;astral-sh/uv&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;90,720&lt;/td&gt;&lt;td&gt;Python package and project manager; the README says 10 to 100 times faster than pip&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;BurntSushi/ripgrep&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;69,112&lt;/td&gt;&lt;td&gt;Recursive regex search that respects .gitignore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dani-garcia/vaultwarden&quot;&gt;dani-garcia/vaultwarden&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;68,985&lt;/td&gt;&lt;td&gt;Lightweight Bitwarden-compatible server, popular for self-hosting&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/alacritty/alacritty&quot;&gt;alacritty/alacritty&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;65,955&lt;/td&gt;&lt;td&gt;OpenGL-accelerated terminal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/warpdotdev/warp&quot;&gt;warpdotdev/warp&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;65,452&lt;/td&gt;&lt;td&gt;Terminal with built-in AI&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-lang/rustlings&quot;&gt;rust-lang/rustlings&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;64,339&lt;/td&gt;&lt;td&gt;Short exercises to learn Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tw93/Pake&quot;&gt;tw93/Pake&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;62,056&lt;/td&gt;&lt;td&gt;Turns a web page into a desktop app with one command&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/FuelLabs/sway&quot;&gt;FuelLabs/sway&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;61,391&lt;/td&gt;&lt;td&gt;Smart contract language for the Fuel network&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sharkdp/bat&quot;&gt;sharkdp/bat&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;60,789&lt;/td&gt;&lt;td&gt;cat with syntax highlighting and git integration&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/starship/starship&quot;&gt;starship/starship&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;60,251&lt;/td&gt;&lt;td&gt;One shell prompt for bash, zsh, fish and others&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/meilisearch/meilisearch&quot;&gt;meilisearch/meilisearch&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;59,558&lt;/td&gt;&lt;td&gt;HTTP search engine with relevance out of the box&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/typst/typst&quot;&gt;typst/typst&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;56,601&lt;/td&gt;&lt;td&gt;Markup-based typesetting, a modern alternative to LaTeX&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/aaif-goose/goose&quot;&gt;aaif-goose/goose&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;55,248&lt;/td&gt;&lt;td&gt;Extensible AI agent for software development&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/astral-sh/ruff&quot;&gt;astral-sh/ruff&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50,053&lt;/td&gt;&lt;td&gt;Python linter and formatter; the README says 10 to 100 times faster than Flake8 and Black&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bevyengine/bevy&quot;&gt;bevyengine/bevy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;48,973&lt;/td&gt;&lt;td&gt;Data-driven game engine with ECS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/helix-editor/helix&quot;&gt;helix-editor/helix&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;46,576&lt;/td&gt;&lt;td&gt;Modal terminal editor with built-in LSP and tree-sitter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/juspay/hyperswitch&quot;&gt;juspay/hyperswitch&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;45,313&lt;/td&gt;&lt;td&gt;Payments platform with routing across processors&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sharkdp/fd&quot;&gt;sharkdp/fd&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;44,781&lt;/td&gt;&lt;td&gt;A simple, fast alternative to find&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sxyazi/yazi&quot;&gt;sxyazi/yazi&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;42,808&lt;/td&gt;&lt;td&gt;Terminal file manager with async I/O&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GyulyVGC/sniffnet&quot;&gt;GyulyVGC/sniffnet&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;41,503&lt;/td&gt;&lt;td&gt;Network traffic monitor with a graphical interface&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nushell/nushell&quot;&gt;nushell/nushell&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;40,657&lt;/td&gt;&lt;td&gt;Shell with structured data pipelines&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pola-rs/polars&quot;&gt;pola-rs/polars&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;40,120&lt;/td&gt;&lt;td&gt;Columnar DataFrames with Python bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ajeetdsouza/zoxide&quot;&gt;ajeetdsouza/zoxide&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;40,087&lt;/td&gt;&lt;td&gt;A cd that learns your most-used directories&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/DioxusLabs/dioxus&quot;&gt;DioxusLabs/dioxus&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;39,383&lt;/td&gt;&lt;td&gt;App framework for web, desktop and mobile, with a React-like API&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/spacedriveapp/spacedrive&quot;&gt;spacedriveapp/spacedrive&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;39,158&lt;/td&gt;&lt;td&gt;Cross-platform file explorer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lapce/lapce&quot;&gt;lapce/lapce&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;38,917&lt;/td&gt;&lt;td&gt;Lightweight native editor with remote mode&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/servo/servo&quot;&gt;servo/servo&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;38,145&lt;/td&gt;&lt;td&gt;Embeddable browser engine, born at Mozilla&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/firecracker-microvm/firecracker&quot;&gt;firecracker-microvm/firecracker&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;37,349&lt;/td&gt;&lt;td&gt;AWS microVMs; the README says it runs Lambda and Fargate&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pnpm/pnpm&quot;&gt;pnpm/pnpm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;36,803&lt;/td&gt;&lt;td&gt;JavaScript package manager with shared storage&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/casey/just&quot;&gt;casey/just&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;36,256&lt;/td&gt;&lt;td&gt;Task runner with simple syntax, in the spirit of make&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/zellij-org/zellij&quot;&gt;zellij-org/zellij&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;35,723&lt;/td&gt;&lt;td&gt;Terminal multiplexer with WebAssembly plugins&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/qdrant/qdrant&quot;&gt;qdrant/qdrant&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;35,065&lt;/td&gt;&lt;td&gt;Vector database with HNSW, filters and replication, common in RAG&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jdx/mise&quot;&gt;jdx/mise&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;34,971&lt;/td&gt;&lt;td&gt;Tool version, environment variable and task manager&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustfs/rustfs&quot;&gt;rustfs/rustfs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;34,870&lt;/td&gt;&lt;td&gt;S3-compatible object storage&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fish-shell/fish-shell&quot;&gt;fish-shell/fish-shell&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;34,296&lt;/td&gt;&lt;td&gt;Interactive shell, rewritten in Rust from version 4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/swc-project/swc&quot;&gt;swc-project/swc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;34,204&lt;/td&gt;&lt;td&gt;JavaScript and TypeScript compiler and bundler&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/TabbyML/tabby&quot;&gt;TabbyML/tabby&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;33,911&lt;/td&gt;&lt;td&gt;Self-hosted coding assistant&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tokio-rs/tokio&quot;&gt;tokio-rs/tokio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;33,440&lt;/td&gt;&lt;td&gt;Async runtime underlying most Rust servers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/surrealdb/surrealdb&quot;&gt;surrealdb/surrealdb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;33,128&lt;/td&gt;&lt;td&gt;Multi-model database, document and graph, with real-time queries&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/yewstack/yew&quot;&gt;yewstack/yew&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;32,821&lt;/td&gt;&lt;td&gt;WebAssembly front-end framework inspired by React and Elm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dandavison/delta&quot;&gt;dandavison/delta&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;32,487&lt;/td&gt;&lt;td&gt;Syntax-highlighting pager for git diff&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jj-vcs/jj&quot;&gt;jj-vcs/jj&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;32,023&lt;/td&gt;&lt;td&gt;Git-compatible version control with a simpler model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ankitects/anki&quot;&gt;ankitects/anki&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,988&lt;/td&gt;&lt;td&gt;Spaced-repetition flashcards, core in Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/atuinsh/atuin&quot;&gt;atuinsh/atuin&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,986&lt;/td&gt;&lt;td&gt;Shell history with search and encrypted sync&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/influxdata/influxdb&quot;&gt;influxdata/influxdb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,763&lt;/td&gt;&lt;td&gt;Time-series database; version 3 is in Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/iced-rs/iced&quot;&gt;iced-rs/iced&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,755&lt;/td&gt;&lt;td&gt;Cross-platform GUI library inspired by Elm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/emilk/egui&quot;&gt;emilk/egui&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,400&lt;/td&gt;&lt;td&gt;Immediate-mode GUI, native and on the web&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/vercel/turborepo&quot;&gt;vercel/turborepo&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,198&lt;/td&gt;&lt;td&gt;Incremental build for many packages in one repository, moved from Go to Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nautechsystems/nautilus_trader&quot;&gt;nautechsystems/nautilus_trader&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;29,938&lt;/td&gt;&lt;td&gt;Event-driven trading platform, backtest and production in the same code&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/chroma-core/chroma&quot;&gt;chroma-core/chroma&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;29,495&lt;/td&gt;&lt;td&gt;Vector database for LLM applications&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/wezterm/wezterm&quot;&gt;wezterm/wezterm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;29,220&lt;/td&gt;&lt;td&gt;GPU-accelerated terminal with a multiplexer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sharkdp/hyperfine&quot;&gt;sharkdp/hyperfine&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;29,084&lt;/td&gt;&lt;td&gt;Command-line benchmarking tool with statistics&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/niri-wm/niri&quot;&gt;niri-wm/niri&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;28,390&lt;/td&gt;&lt;td&gt;Wayland compositor with scrollable tiling&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cloudflare/pingora&quot;&gt;cloudflare/pingora&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,614&lt;/td&gt;&lt;td&gt;Cloudflare&#39;s HTTP proxy framework, open-sourced in February 2024&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GraphiteEditor/Graphite&quot;&gt;GraphiteEditor/Graphite&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,572&lt;/td&gt;&lt;td&gt;2D graphics editor with a node-based procedural engine&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tokio-rs/axum&quot;&gt;tokio-rs/axum&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,465&lt;/td&gt;&lt;td&gt;Web framework on tokio and tower&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tree-sitter/tree-sitter&quot;&gt;tree-sitter/tree-sitter&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,177&lt;/td&gt;&lt;td&gt;Incremental parser generator used in editors&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Schniz/fnm&quot;&gt;Schniz/fnm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,093&lt;/td&gt;&lt;td&gt;Node version manager&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Wilfred/difftastic&quot;&gt;Wilfred/difftastic&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;26,007&lt;/td&gt;&lt;td&gt;Structural diff that understands language syntax&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/biomejs/biome&quot;&gt;biomejs/biome&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25,945&lt;/td&gt;&lt;td&gt;Formatter and linter for web projects&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rwf2/Rocket&quot;&gt;rwf2/Rocket&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25,780&lt;/td&gt;&lt;td&gt;Web framework focused on type safety and ergonomics&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/clockworklabs/SpacetimeDB&quot;&gt;clockworklabs/SpacetimeDB&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25,288&lt;/td&gt;&lt;td&gt;Database with built-in server logic, for real-time apps&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/actix/actix-web&quot;&gt;actix/actix-web&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24,858&lt;/td&gt;&lt;td&gt;Performance-focused web framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ogham/exa&quot;&gt;ogham/exa&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24,450&lt;/td&gt;&lt;td&gt;ls replacement, unmaintained; the README points to the eza fork&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/uutils/coreutils&quot;&gt;uutils/coreutils&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24,233&lt;/td&gt;&lt;td&gt;Cross-platform rewrite of GNU coreutils&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/slint-ui/slint&quot;&gt;slint-ui/slint&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24,168&lt;/td&gt;&lt;td&gt;Declarative GUI toolkit for Rust, C++, JavaScript and Python&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/eza-community/eza&quot;&gt;eza-community/eza&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;23,548&lt;/td&gt;&lt;td&gt;Maintained fork of exa&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;by-domain&quot;&gt;By domain&lt;/h2&gt;
&lt;h3 id=&quot;command-line-tools&quot;&gt;Command-line tools&lt;/h3&gt;
&lt;p&gt;The ripgrep, fd, bat, delta and just tools are already in the core. Below them:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-lang/mdBook&quot;&gt;rust-lang/mdBook&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22,213&lt;/td&gt;&lt;td&gt;Books in Markdown, used for the official Rust book&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/getzola/zola&quot;&gt;getzola/zola&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17,511&lt;/td&gt;&lt;td&gt;Static site generator, the one behind this blog&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/XAMPPRocky/tokei&quot;&gt;XAMPPRocky/tokei&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,994&lt;/td&gt;&lt;td&gt;Counts lines of code by language&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ClementTsang/bottom&quot;&gt;ClementTsang/bottom&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,101&lt;/td&gt;&lt;td&gt;Terminal system monitor&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bootandy/dust&quot;&gt;bootandy/dust&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,497&lt;/td&gt;&lt;td&gt;Disk usage, in the spirit of du&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/imsnif/bandwhich&quot;&gt;imsnif/bandwhich&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,001&lt;/td&gt;&lt;td&gt;Bandwidth use per process&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sharkdp/hexyl&quot;&gt;sharkdp/hexyl&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10,291&lt;/td&gt;&lt;td&gt;Hex viewer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pemistahl/grex&quot;&gt;pemistahl/grex&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8,219&lt;/td&gt;&lt;td&gt;Generates regex from examples&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/svenstaro/miniserve&quot;&gt;svenstaro/miniserve&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,898&lt;/td&gt;&lt;td&gt;HTTP file server&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tealdeer-rs/tealdeer&quot;&gt;tealdeer-rs/tealdeer&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,590&lt;/td&gt;&lt;td&gt;tldr client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sharkdp/pastel&quot;&gt;sharkdp/pastel&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,516&lt;/td&gt;&lt;td&gt;Color manipulation in the terminal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dalance/procs&quot;&gt;dalance/procs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,193&lt;/td&gt;&lt;td&gt;Modern ps replacement&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ouch-org/ouch&quot;&gt;ouch-org/ouch&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,786&lt;/td&gt;&lt;td&gt;Compresses and decompresses many formats&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cgag/loc&quot;&gt;cgag/loc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,456&lt;/td&gt;&lt;td&gt;Lines-of-code counter&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;git-build-and-binary-size&quot;&gt;Git, build and binary size&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/gitbutlerapp/gitbutler&quot;&gt;gitbutlerapp/gitbutler&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,806&lt;/td&gt;&lt;td&gt;Visual Git client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rui314/mold&quot;&gt;rui314/mold&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17,633&lt;/td&gt;&lt;td&gt;Fast linker, works with Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GitoxideLabs/gitoxide&quot;&gt;GitoxideLabs/gitoxide&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,012&lt;/td&gt;&lt;td&gt;Pure Rust implementation of Git&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/johnthagen/min-sized-rust&quot;&gt;johnthagen/min-sized-rust&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,857&lt;/td&gt;&lt;td&gt;Techniques to shrink Rust binaries&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/mozilla/sccache&quot;&gt;mozilla/sccache&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,778&lt;/td&gt;&lt;td&gt;Distributed compilation cache&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/flamegraph-rs/flamegraph&quot;&gt;flamegraph-rs/flamegraph&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,047&lt;/td&gt;&lt;td&gt;Generates flamegraphs from perf and dtrace&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RazrFalcon/cargo-bloat&quot;&gt;RazrFalcon/cargo-bloat&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,774&lt;/td&gt;&lt;td&gt;Shows what takes up space in an executable&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-lang/git2-rs&quot;&gt;rust-lang/git2-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,114&lt;/td&gt;&lt;td&gt;libgit2 bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/AlexEne/twiggy&quot;&gt;AlexEne/twiggy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,427&lt;/td&gt;&lt;td&gt;Shows what takes up space in a .wasm binary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/matklad/cargo-xtask&quot;&gt;matklad/cargo-xtask&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,338&lt;/td&gt;&lt;td&gt;Build automation pattern with cargo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nnethercote/dhat-rs&quot;&gt;nnethercote/dhat-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,010&lt;/td&gt;&lt;td&gt;Heap profiling&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;runtimes-and-platforms&quot;&gt;Runtimes and platforms&lt;/h3&gt;
&lt;p&gt;Deno, Bun, Tauri, pnpm and tokio are in the core. The smaller async runtimes and the WebAssembly platforms:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/vercel/turborepo&quot;&gt;vercel/turborepo&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31,198&lt;/td&gt;&lt;td&gt;Incremental build for many packages in one repository&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/shuttle-hq/shuttle&quot;&gt;shuttle-hq/shuttle&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,916&lt;/td&gt;&lt;td&gt;Deployment platform for Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/spinframework/spin&quot;&gt;spinframework/spin&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,525&lt;/td&gt;&lt;td&gt;Serverless microservices in WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/extism/extism&quot;&gt;extism/extism&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,794&lt;/td&gt;&lt;td&gt;WebAssembly plugin system&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/monoio-rs/monoio&quot;&gt;monoio-rs/monoio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,126&lt;/td&gt;&lt;td&gt;Thread-per-core async runtime on io_uring, from ByteDance&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/smol-rs/smol&quot;&gt;smol-rs/smol&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,082&lt;/td&gt;&lt;td&gt;Small async runtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/async-rs/async-std&quot;&gt;async-rs/async-std&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,062&lt;/td&gt;&lt;td&gt;Async runtime with a std-like API&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/DataDog/glommio&quot;&gt;DataDog/glommio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,663&lt;/td&gt;&lt;td&gt;Thread-per-core runtime on io_uring&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/compio-rs/compio&quot;&gt;compio-rs/compio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,916&lt;/td&gt;&lt;td&gt;Completion-based I/O runtime&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;infrastructure-databases-and-search&quot;&gt;Infrastructure, databases and search&lt;/h3&gt;
&lt;p&gt;Meilisearch, Qdrant, InfluxDB, SurrealDB, Polars and SpacetimeDB are in the core.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/neondatabase/neon&quot;&gt;neondatabase/neon&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;23,197&lt;/td&gt;&lt;td&gt;Serverless Postgres with storage separated from compute&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/vectordotdev/vector&quot;&gt;vectordotdev/vector&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22,697&lt;/td&gt;&lt;td&gt;Logs and metrics pipeline, maintained by Datadog&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/valeriansaliou/sonic&quot;&gt;valeriansaliou/sonic&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,358&lt;/td&gt;&lt;td&gt;Lightweight search back end&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tikv/tikv&quot;&gt;tikv/tikv&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;16,908&lt;/td&gt;&lt;td&gt;Distributed key-value store, the base of TiDB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/quickwit-oss/tantivy&quot;&gt;quickwit-oss/tantivy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;16,211&lt;/td&gt;&lt;td&gt;Full-text search library inspired by Lucene&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/microsoft/windows-rs&quot;&gt;microsoft/windows-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,817&lt;/td&gt;&lt;td&gt;Bindings for the Windows APIs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/quickwit-oss/quickwit&quot;&gt;quickwit-oss/quickwit&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,713&lt;/td&gt;&lt;td&gt;Cloud-native search and observability&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bottlerocket-os/bottlerocket&quot;&gt;bottlerocket-os/bottlerocket&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,678&lt;/td&gt;&lt;td&gt;Operating system for containers, from AWS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/databendlabs/databend&quot;&gt;databendlabs/databend&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,466&lt;/td&gt;&lt;td&gt;Cloud data warehouse&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/apache/datafusion&quot;&gt;apache/datafusion&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,444&lt;/td&gt;&lt;td&gt;Analytical SQL query engine&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/risingwavelabs/risingwave&quot;&gt;risingwavelabs/risingwave&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,369&lt;/td&gt;&lt;td&gt;Streaming database with SQL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/spacejam/sled&quot;&gt;spacejam/sled&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,095&lt;/td&gt;&lt;td&gt;Embedded database&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/youki-dev/youki&quot;&gt;youki-dev/youki&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,629&lt;/td&gt;&lt;td&gt;OCI container runtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GreptimeTeam/greptimedb&quot;&gt;GreptimeTeam/greptimedb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,734&lt;/td&gt;&lt;td&gt;Cloud-native time-series database&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/MaterializeInc/materialize&quot;&gt;MaterializeInc/materialize&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,382&lt;/td&gt;&lt;td&gt;SQL over data streams&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/apache/opendal&quot;&gt;apache/opendal&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,412&lt;/td&gt;&lt;td&gt;Unified access to storage services&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fluvio-community/fluvio&quot;&gt;fluvio-community/fluvio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,256&lt;/td&gt;&lt;td&gt;Streaming platform&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cberner/redb&quot;&gt;cberner/redb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,847&lt;/td&gt;&lt;td&gt;Embedded key-value database in pure Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/kube-rs/kube&quot;&gt;kube-rs/kube&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,844&lt;/td&gt;&lt;td&gt;Kubernetes client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/apache/arrow-rs&quot;&gt;apache/arrow-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,641&lt;/td&gt;&lt;td&gt;Official Apache Arrow implementation in Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/delta-io/delta-rs&quot;&gt;delta-io/delta-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,341&lt;/td&gt;&lt;td&gt;Native Delta Lake&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/eclipse-zenoh/zenoh&quot;&gt;eclipse-zenoh/zenoh&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,256&lt;/td&gt;&lt;td&gt;Pub/sub and query for IoT and robotics&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fjall-rs/fjall&quot;&gt;fjall-rs/fjall&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,377&lt;/td&gt;&lt;td&gt;Embedded LSM tree&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/apache/datafusion-ballista&quot;&gt;apache/datafusion-ballista&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,146&lt;/td&gt;&lt;td&gt;Distributed DataFusion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/databendlabs/openraft&quot;&gt;databendlabs/openraft&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,089&lt;/td&gt;&lt;td&gt;Raft implementation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lnx-search/lnx&quot;&gt;lnx-search/lnx&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,456&lt;/td&gt;&lt;td&gt;Search server built on tantivy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GlareDB/glaredb&quot;&gt;GlareDB/glaredb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,024&lt;/td&gt;&lt;td&gt;Analytical SQL over many sources&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/meilisearch/heed&quot;&gt;meilisearch/heed&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;921&lt;/td&gt;&lt;td&gt;Typed LMDB wrapper&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;web-and-apis&quot;&gt;Web and APIs&lt;/h3&gt;
&lt;p&gt;Axum, Actix Web and Rocket are in the core.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/leptos-rs/leptos&quot;&gt;leptos-rs/leptos&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,388&lt;/td&gt;&lt;td&gt;Full-stack framework with fine-grained reactivity&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/transact-rs/sqlx&quot;&gt;transact-rs/sqlx&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17,563&lt;/td&gt;&lt;td&gt;Async SQL with compile-time checked queries&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/diesel-rs/diesel&quot;&gt;diesel-rs/diesel&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,202&lt;/td&gt;&lt;td&gt;ORM and query builder&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/grpc/grpc-rust&quot;&gt;grpc/grpc-rust&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,491&lt;/td&gt;&lt;td&gt;gRPC implementation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/seanmonstar/warp&quot;&gt;seanmonstar/warp&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10,378&lt;/td&gt;&lt;td&gt;Web framework built from filters&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/SeaQL/sea-orm&quot;&gt;SeaQL/sea-orm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,924&lt;/td&gt;&lt;td&gt;Async ORM&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/loco-rs/loco&quot;&gt;loco-rs/loco&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,439&lt;/td&gt;&lt;td&gt;Rails-style framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/poem-web/poem&quot;&gt;poem-web/poem&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,448&lt;/td&gt;&lt;td&gt;Web framework with OpenAPI generation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/salvo-rs/salvo&quot;&gt;salvo-rs/salvo&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,447&lt;/td&gt;&lt;td&gt;Web framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tower-rs/tower&quot;&gt;tower-rs/tower&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,320&lt;/td&gt;&lt;td&gt;Middleware and service abstractions&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ntex-rs/ntex&quot;&gt;ntex-rs/ntex&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,541&lt;/td&gt;&lt;td&gt;Network and web framework&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;security-and-cryptography&quot;&gt;Security and cryptography&lt;/h3&gt;
&lt;p&gt;Vaultwarden is in the core.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/firezone/firezone&quot;&gt;firezone/firezone&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,113&lt;/td&gt;&lt;td&gt;Zero-trust access over WireGuard; the repository&#39;s main language is Elixir&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustls/rustls&quot;&gt;rustls/rustls&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,672&lt;/td&gt;&lt;td&gt;TLS in pure Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/mullvad/mullvadvpn-app&quot;&gt;mullvad/mullvadvpn-app&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,665&lt;/td&gt;&lt;td&gt;Mullvad VPN app, daemon in Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cloudflare/boringtun&quot;&gt;cloudflare/boringtun&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,218&lt;/td&gt;&lt;td&gt;Userspace WireGuard&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/briansmith/ring&quot;&gt;briansmith/ring&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,107&lt;/td&gt;&lt;td&gt;Cryptographic primitives focused on TLS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/str4d/rage&quot;&gt;str4d/rage&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,682&lt;/td&gt;&lt;td&gt;File encryption in the age format&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/EmbarkStudios/cargo-deny&quot;&gt;EmbarkStudios/cargo-deny&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,452&lt;/td&gt;&lt;td&gt;Checks licenses, advisories and dependencies&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Keats/jsonwebtoken&quot;&gt;Keats/jsonwebtoken&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,100&lt;/td&gt;&lt;td&gt;JWT&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustsec/rustsec&quot;&gt;rustsec/rustsec&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,966&lt;/td&gt;&lt;td&gt;Security advisory database for crates&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ramosbugs/oauth2-rs&quot;&gt;ramosbugs/oauth2-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,211&lt;/td&gt;&lt;td&gt;OAuth2 client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RustCrypto/password-hashes&quot;&gt;RustCrypto/password-hashes&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;914&lt;/td&gt;&lt;td&gt;Argon2, bcrypt, scrypt and the like&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-bitcoin/rust-secp256k1&quot;&gt;rust-bitcoin/rust-secp256k1&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;430&lt;/td&gt;&lt;td&gt;libsecp256k1 bindings&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;ai-ml-and-llm-infrastructure&quot;&gt;AI, ML and LLM infrastructure&lt;/h3&gt;
&lt;p&gt;Qdrant, Chroma, Polars and Tabby are in the core.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/huggingface/candle&quot;&gt;huggingface/candle&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,168&lt;/td&gt;&lt;td&gt;Minimalist ML framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tracel-ai/burn&quot;&gt;tracel-ai/burn&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;16,107&lt;/td&gt;&lt;td&gt;Deep learning portable across back ends&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lancedb/lancedb&quot;&gt;lancedb/lancedb&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,665&lt;/td&gt;&lt;td&gt;Serverless vector database on the Lance format&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/huggingface/tokenizers&quot;&gt;huggingface/tokenizers&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,168&lt;/td&gt;&lt;td&gt;Fast tokenizers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/0xPlaygrounds/rig&quot;&gt;0xPlaygrounds/rig&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8,870&lt;/td&gt;&lt;td&gt;Framework for LLM agents&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/EricLBuehler/mistral.rs&quot;&gt;EricLBuehler/mistral.rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,743&lt;/td&gt;&lt;td&gt;LLM inference with quantization&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustformers/llm&quot;&gt;rustformers/llm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,153&lt;/td&gt;&lt;td&gt;LLM inference&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/LaurentMazare/tch-rs&quot;&gt;LaurentMazare/tch-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,503&lt;/td&gt;&lt;td&gt;libtorch bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Rust-GPU/rust-cuda&quot;&gt;Rust-GPU/rust-cuda&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,407&lt;/td&gt;&lt;td&gt;Rust compiled for NVIDIA GPUs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-ml/linfa&quot;&gt;rust-ml/linfa&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,759&lt;/td&gt;&lt;td&gt;Classic ML algorithms, in the spirit of scikit-learn&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/safetensors/safetensors&quot;&gt;safetensors/safetensors&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,917&lt;/td&gt;&lt;td&gt;Safe tensor format&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sonos/tract&quot;&gt;sonos/tract&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,087&lt;/td&gt;&lt;td&gt;ONNX and TensorFlow inference&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pykeio/ort&quot;&gt;pykeio/ort&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,559&lt;/td&gt;&lt;td&gt;ONNX Runtime bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/64bit/async-openai&quot;&gt;64bit/async-openai&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,017&lt;/td&gt;&lt;td&gt;Async client for the OpenAI API&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sobelio/llm-chain&quot;&gt;sobelio/llm-chain&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,603&lt;/td&gt;&lt;td&gt;Chaining LLM calls&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/chelsea0x3b/cudarc&quot;&gt;chelsea0x3b/cudarc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,231&lt;/td&gt;&lt;td&gt;CUDA bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/srush/llama2.rs&quot;&gt;srush/llama2.rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,063&lt;/td&gt;&lt;td&gt;Llama 2 in Rust, for teaching&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pepperoni21/ollama-rs&quot;&gt;pepperoni21/ollama-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,061&lt;/td&gt;&lt;td&gt;Ollama client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/smartcorelib/smartcore&quot;&gt;smartcorelib/smartcore&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;964&lt;/td&gt;&lt;td&gt;ML library&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/utilityai/llama-cpp-rs&quot;&gt;utilityai/llama-cpp-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;657&lt;/td&gt;&lt;td&gt;llama.cpp bindings&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;embedded-and-low-level-systems&quot;&gt;Embedded and low-level systems&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/redox-os/redox&quot;&gt;redox-os/redox&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;16,620&lt;/td&gt;&lt;td&gt;Unix-like operating system written in Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/embassy-rs/embassy&quot;&gt;embassy-rs/embassy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,957&lt;/td&gt;&lt;td&gt;Async embedded&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tock/tock&quot;&gt;tock/tock&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,464&lt;/td&gt;&lt;td&gt;Secure operating system for microcontrollers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/oxidecomputer/hubris&quot;&gt;oxidecomputer/hubris&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,631&lt;/td&gt;&lt;td&gt;Oxide&#39;s embedded operating system&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/theseus-os/Theseus&quot;&gt;theseus-os/Theseus&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,212&lt;/td&gt;&lt;td&gt;Research operating system that uses Rust&#39;s type system&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nix-rust/nix&quot;&gt;nix-rust/nix&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,079&lt;/td&gt;&lt;td&gt;POSIX bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/probe-rs/probe-rs&quot;&gt;probe-rs/probe-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,975&lt;/td&gt;&lt;td&gt;Debugging and flashing microcontrollers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-lang/libc&quot;&gt;rust-lang/libc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,628&lt;/td&gt;&lt;td&gt;libc bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rtic-rs/rtic&quot;&gt;rtic-rs/rtic&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,420&lt;/td&gt;&lt;td&gt;Real-time concurrency for microcontrollers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/seL4/rust-sel4&quot;&gt;seL4/rust-sel4&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;216&lt;/td&gt;&lt;td&gt;Rust support for the verified seL4 microkernel&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Outside GitHub, &lt;a rel=&quot;external&quot; href=&quot;https://ferrocene.dev&quot;&gt;Ferrocene&lt;/a&gt; is a Rust compiler qualified for safety-critical software, such as automotive.&lt;/p&gt;
&lt;h3 id=&quot;graphics-gui-games-and-audio&quot;&gt;Graphics, GUI, games and audio&lt;/h3&gt;
&lt;p&gt;Bevy, egui, iced and Slint are in the core. The physics in &lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/rapier&quot;&gt;rapier&lt;/a&gt; is the same idea of simulation that shows up, at another scale, in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/z-machine-fisica-hed/&quot;&gt;Z machine&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ratatui/ratatui&quot;&gt;ratatui/ratatui&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22,965&lt;/td&gt;&lt;td&gt;Text user interfaces in the terminal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/gfx-rs/wgpu&quot;&gt;gfx-rs/wgpu&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;18,278&lt;/td&gt;&lt;td&gt;Cross-platform WebGPU, native and on the web&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/druid&quot;&gt;linebender/druid&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,702&lt;/td&gt;&lt;td&gt;UI toolkit, predecessor of xilem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/veloren/veloren&quot;&gt;veloren/veloren&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,621&lt;/td&gt;&lt;td&gt;Open-world voxel RPG&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/makepad/makepad&quot;&gt;makepad/makepad&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,170&lt;/td&gt;&lt;td&gt;UI framework and creative environment&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-windowing/winit&quot;&gt;rust-windowing/winit&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,204&lt;/td&gt;&lt;td&gt;Cross-platform window creation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fschutt/azul&quot;&gt;fschutt/azul&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,129&lt;/td&gt;&lt;td&gt;GUI on WebRender&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/rapier&quot;&gt;dimforge/rapier&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,853&lt;/td&gt;&lt;td&gt;2D and 3D physics, with JavaScript and WebAssembly bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/xilem&quot;&gt;linebender/xilem&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,570&lt;/td&gt;&lt;td&gt;Experimental UI framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/nalgebra&quot;&gt;dimforge/nalgebra&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,801&lt;/td&gt;&lt;td&gt;Linear algebra&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ggez/ggez&quot;&gt;ggez/ggez&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,703&lt;/td&gt;&lt;td&gt;2D game framework&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/not-fl3/macroquad&quot;&gt;not-fl3/macroquad&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,662&lt;/td&gt;&lt;td&gt;Simple 2D games, including on the web&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/vello&quot;&gt;linebender/vello&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,417&lt;/td&gt;&lt;td&gt;2D renderer on the GPU&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lapce/floem&quot;&gt;lapce/floem&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,296&lt;/td&gt;&lt;td&gt;GUI with fine-grained reactivity&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/crossterm-rs/crossterm&quot;&gt;crossterm-rs/crossterm&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,242&lt;/td&gt;&lt;td&gt;Cross-platform terminal manipulation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RustAudio/cpal&quot;&gt;RustAudio/cpal&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,966&lt;/td&gt;&lt;td&gt;Audio input and output&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pdeljanov/Symphonia&quot;&gt;pdeljanov/Symphonia&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,434&lt;/td&gt;&lt;td&gt;Pure Rust audio decoder&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/imgui-rs/imgui-rs&quot;&gt;imgui-rs/imgui-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,058&lt;/td&gt;&lt;td&gt;Dear ImGui bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Rust-SDL2/rust-sdl2&quot;&gt;Rust-SDL2/rust-sdl2&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,952&lt;/td&gt;&lt;td&gt;SDL2 bindings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RustAudio/rodio&quot;&gt;RustAudio/rodio&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,488&lt;/td&gt;&lt;td&gt;Audio playback&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bitshifter/glam-rs&quot;&gt;bitshifter/glam-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,077&lt;/td&gt;&lt;td&gt;SIMD vector math for games and graphics&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/gfx-rs/naga&quot;&gt;gfx-rs/naga&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,565&lt;/td&gt;&lt;td&gt;Shader translator, now inside the wgpu repository&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tesselode/kira&quot;&gt;tesselode/kira&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,071&lt;/td&gt;&lt;td&gt;Audio for games&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/parry&quot;&gt;dimforge/parry&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;880&lt;/td&gt;&lt;td&gt;Collision detection&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;blockchain-and-zero-knowledge-proofs&quot;&gt;Blockchain and zero-knowledge proofs&lt;/h3&gt;
&lt;p&gt;Sway is in the core.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/solana-labs/solana&quot;&gt;solana-labs/solana&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,950&lt;/td&gt;&lt;td&gt;Solana blockchain; the old repository was archived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/paritytech/substrate&quot;&gt;paritytech/substrate&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8,386&lt;/td&gt;&lt;td&gt;Polkadot&#39;s blockchain framework; archived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/paradigmxyz/reth&quot;&gt;paradigmxyz/reth&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,825&lt;/td&gt;&lt;td&gt;Ethereum execution client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sigp/lighthouse&quot;&gt;sigp/lighthouse&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,484&lt;/td&gt;&lt;td&gt;Ethereum consensus client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rust-bitcoin/rust-bitcoin&quot;&gt;rust-bitcoin/rust-bitcoin&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,684&lt;/td&gt;&lt;td&gt;Bitcoin types and serialization&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/near/nearcore&quot;&gt;near/nearcore&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,620&lt;/td&gt;&lt;td&gt;NEAR network node&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/namada-net/namada&quot;&gt;namada-net/namada&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,517&lt;/td&gt;&lt;td&gt;Privacy-focused blockchain&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/risc0/risc0&quot;&gt;risc0/risc0&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,203&lt;/td&gt;&lt;td&gt;zk virtual machine&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/succinctlabs/sp1&quot;&gt;succinctlabs/sp1&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,747&lt;/td&gt;&lt;td&gt;zk virtual machine on RISC-V&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/noir-lang/noir&quot;&gt;noir-lang/noir&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,410&lt;/td&gt;&lt;td&gt;Language for zk circuits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/alloy-rs/alloy&quot;&gt;alloy-rs/alloy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,337&lt;/td&gt;&lt;td&gt;Ethereum tooling, successor to ethers-rs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/zcash/halo2&quot;&gt;zcash/halo2&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;920&lt;/td&gt;&lt;td&gt;Proof system&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/0xPolygonZero/plonky2&quot;&gt;0xPolygonZero/plonky2&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;859&lt;/td&gt;&lt;td&gt;Recursive proof system&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ZcashFoundation/zebra&quot;&gt;ZcashFoundation/zebra&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;622&lt;/td&gt;&lt;td&gt;Zcash node&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;benchmarks-with-a-source&quot;&gt;Benchmarks with a source&lt;/h2&gt;
&lt;p&gt;I kept only the benchmarks with a primary source, code or methodology. Out went the async runtime ones (a post with no code or raw data), the WebAssembly runtime ones (the repository itself marked the numbers as placeholders), and the gitoxide and Redis-style server ones (the sources were only a site&#39;s home page, or a site that is down).&lt;/p&gt;
&lt;h3 id=&quot;ripgrep-versus-grep-and-friends&quot;&gt;Ripgrep versus grep and friends&lt;/h3&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep README&lt;/a&gt; has tables measured by the author on an Intel i9-12900K. Searching for &lt;code&gt;[A-Z]+_SUSPEND&lt;/code&gt; as a word in the Linux kernel source:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Time&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Ratio&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ripgrep&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.082 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.00x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;git grep&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.273 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3.34x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The Silver Searcher&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.443 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.43x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ugrep&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.639 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7.82x&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ignoring &lt;code&gt;.gitignore&lt;/code&gt; and filtering by file type, ripgrep takes 0.063 s and GNU grep 0.674 s. On a single file of about 13 GB already cached, the search &lt;code&gt;Sherlock [A-Z]\w+&lt;/code&gt; takes 1.042 s in ripgrep, 1.339 s in ugrep and 6.577 s in GNU grep. The same README shows the limits: on a pattern with no literal, like &lt;code&gt;[A-Za-z]{30}&lt;/code&gt;, the lead over GNU grep drops to about 2x, and there are patterns where another tool falls off a cliff and ripgrep does not. The first version of this post cited these numbers from ripgrep.dev, which is an unofficial site.&lt;/p&gt;
&lt;h3 id=&quot;web-frameworks&quot;&gt;Web frameworks&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://sharkbench.dev/web/rust&quot;&gt;Sharkbench&lt;/a&gt; measures concurrent requests with I/O and JSON on an Intel Core Ultra 5 325 running Linux. The page was updated on 5 October 2026:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Framework&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Req/s&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Median latency&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Memory&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Hyper&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;27,372&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.2 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4.6 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Axum&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;26,909&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.2 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.7 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Actix&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;23,833&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.3 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6.9 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rocket&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,365&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.5 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7.1 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ASP.NET Core&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17,561&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.5 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;46.6 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Express&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,670&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3.7 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;84.8 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Gin&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,652&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3.3 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;13.5 MB&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two caveats. The order changes between updates: in the first version of this post, with numbers from another run, Actix was first. And the page does not describe the load generator or concurrency, so Gin behind Express is a result I would not take as a rule without reading the test code.&lt;/p&gt;
&lt;h3 id=&quot;javascript-runtimes&quot;&gt;JavaScript runtimes&lt;/h3&gt;
&lt;p&gt;I removed the Bun, Deno and Node numbers: the sources were author profile pages, with no article. What stays is the warning that applies to any comparison of this kind. In a &lt;a rel=&quot;external&quot; href=&quot;https://github.com/denoland/deno/discussions/15121&quot;&gt;discussion in the Deno repository&lt;/a&gt;, Luca Casonato, from the Deno team, answers that you cannot compare two systems with a single HTTP benchmark, because that test does no routing, serves no static files and ignores the rest of what a server does.&lt;/p&gt;
&lt;h3 id=&quot;pingora-versus-nginx-in-production&quot;&gt;Pingora versus NGINX, in production&lt;/h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&quot;&gt;Cloudflare&#39;s September 2022 post&lt;/a&gt;, Pingora serves more than a trillion requests a day and, under the same load, uses about 70% less CPU and 67% less memory than the previous NGINX-based service. Median TTFB dropped by 5 ms and p95 by 80 ms. For one large customer, the connection reuse ratio went from 87.1% to 99.92%, which cut new connections to the origin by 160 times. Much of the gain comes from sharing the connection pool across threads, which NGINX&#39;s process model does not allow.&lt;/p&gt;
&lt;h3 id=&quot;polars-pandas-and-plain-rust&quot;&gt;Polars, pandas and plain Rust&lt;/h3&gt;
&lt;p&gt;Haixuan Tao compared the three &lt;a rel=&quot;external&quot; href=&quot;https://haixuantao.github.io/pandas-polars/24-conculsion.html&quot;&gt;on a 4.2 GB dataset&lt;/a&gt; from Stack Overflow, on an Intel i7-8750H with 12 threads, with &lt;a rel=&quot;external&quot; href=&quot;https://github.com/haixuanTao/dataframe-python-rust&quot;&gt;open code&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Implementation&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Total time&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Versus pandas&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;pandas&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;80 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Polars, single thread&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;30 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2.6x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Polars, multithreaded&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4.7x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Polars, lazy and multithreaded&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;16.5 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4.8x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Plain Rust, single thread&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3.3x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Plain Rust, multithreaded&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;13.7 s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8x&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Leaving out reading the file, multithreaded Rust takes 1.7 s against 40 s for pandas, about 23x. His advice: Polars for the API and for merges and group-bys, pandas when performance and memory do not matter.&lt;/p&gt;
&lt;h3 id=&quot;webassembly-runtimes&quot;&gt;WebAssembly runtimes&lt;/h3&gt;
&lt;p&gt;I found no reproducible, current comparison. If you want to go through the literature, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/3491204.3527477&quot;&gt;Hockley and Williamson&lt;/a&gt; measured scripting performance in Wasmer at the ICPE 2022 conference.&lt;/p&gt;
&lt;h2 id=&quot;who-uses-it-in-production&quot;&gt;Who uses it in production&lt;/h2&gt;
&lt;p&gt;Only the cases with a source from the company itself stayed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code search &lt;a rel=&quot;external&quot; href=&quot;https://code.visualstudio.com/updates/v1_11&quot;&gt;switched to ripgrep&lt;/a&gt; in version 1.11, in 2017&lt;/li&gt;
&lt;li&gt;Cloudflare &lt;a rel=&quot;external&quot; href=&quot;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&quot;&gt;replaced NGINX with Pingora&lt;/a&gt; in the proxy that connects its network to the internet&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/firecracker-microvm/firecracker&quot;&gt;Firecracker&lt;/a&gt; runs AWS Lambda and AWS Fargate, according to its README&lt;/li&gt;
&lt;li&gt;Discord &lt;a rel=&quot;external&quot; href=&quot;https://discord.com/blog/why-discord-is-switching-from-go-to-rust&quot;&gt;moved its Read States service from Go to Rust&lt;/a&gt; in 2020, because of latency spikes from Go&#39;s garbage collector&lt;/li&gt;
&lt;li&gt;Vercel &lt;a rel=&quot;external&quot; href=&quot;https://vercel.com/blog/finishing-turborepos-migration-from-go-to-rust&quot;&gt;finished porting Turborepo from Go to Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first version had more cases and a list of market statistics, such as &quot;45% of the Fortune 500 run Rust&quot;, taken from blogs with no source. I removed everything I could not tie to a primary source, including &quot;Discord cut memory by 8 times&quot;, which Discord&#39;s post does not say.&lt;/p&gt;
&lt;h2 id=&quot;what-i-take-from-it&quot;&gt;What I take from it&lt;/h2&gt;
&lt;p&gt;Most of the top is developer tooling: search, terminals, shells, editors, package managers. It makes sense, because the first Rust adopters were developers writing tools for themselves, where speed, resource use and the command-line experience decide. Right behind come infrastructure and data: proxies, vector databases, search, time series, DataFrames.&lt;/p&gt;
&lt;p&gt;The technical patterns repeat. Servers are async on tokio. The most common shape is a single binary configured by file or command line. WebAssembly plugins show up where cheap runtime extension is wanted, as in Zellij. And the foundation is almost always the same: serde, clap, anyhow and thiserror, rayon, reqwest, hyper.&lt;/p&gt;
&lt;p&gt;Where there is a serious benchmark, the advantage holds, but with limits. On the Linux kernel, ripgrep is 3 to 11 times ahead of the other tools, and loses its margin on patterns with no literal. Pingora shows a production gain, with CPU and memory measured by the operator itself. Outside those cases, the gain over optimized C or Go is often small, and what weighs in the choice is memory safety, the type system and tooling.&lt;/p&gt;
&lt;p&gt;The gaps I see: a full-stack web framework with a plugin ecosystem at the level of Django or Rails, a complete data engineering stack at the level of Spark and Airflow, GUI that competes with Electron and Qt, and native ML that competes with PyTorch. Burn and Candle exist, but are still smaller.&lt;/p&gt;
&lt;h2 id=&quot;rust-and-webassembly-books-and-resources&quot;&gt;Rust and WebAssembly books and resources&lt;/h2&gt;
&lt;p&gt;The starting point changed in 2025: the rustwasm organization on GitHub &lt;a rel=&quot;external&quot; href=&quot;https://blog.rust-lang.org/inside-rust/2025/07/21/sunsetting-the-rustwasm-github-org/&quot;&gt;was sunset&lt;/a&gt;, and &quot;The Rust and WebAssembly Book&quot; was frozen. wasm-bindgen and wasm-pack moved to a new organization, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/wasm-bindgen&quot;&gt;wasm-bindgen&lt;/a&gt;. The old book is still good as an introduction, it just stopped in time.&lt;/p&gt;
&lt;h3 id=&quot;rust-foundations&quot;&gt;Rust foundations&lt;/h3&gt;
&lt;p&gt;WebAssembly demands ownership and borrowing (there is no garbage collector in the browser), interop with JavaScript, async and &lt;code&gt;no_std&lt;/code&gt;, because many environments do not have the full standard library.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Book&lt;/th&gt;&lt;th&gt;Authors&lt;/th&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;th&gt;What for&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://nostarch.com/rust-programming-language-3e&quot;&gt;The Rust Programming Language, 3rd edition&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Steve Klabnik, Carol Nichols, Chris Krycho&lt;/td&gt;&lt;td&gt;No Starch, March 2026&lt;/td&gt;&lt;td&gt;The starting point; covers the 2024 edition and has a new async chapter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.oreilly.com/library/view/programming-rust-3rd/9781098176228/&quot;&gt;Programming Rust, 3rd edition&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Jim Blandy, Jason Orendorff, Leonora Tindall&lt;/td&gt;&lt;td&gt;O&#39;Reilly, due October to November 2026, 748 pages&lt;/td&gt;&lt;td&gt;Intermediate to advanced; the FFI part helps you understand WebAssembly underneath&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://rust-for-rustaceans.com&quot;&gt;Rust for Rustaceans&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Jon Gjengset&lt;/td&gt;&lt;td&gt;No Starch, 2021&lt;/td&gt;&lt;td&gt;The step after the official book: unsafe, traits, reusable crates&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.manning.com/books/rust-in-action&quot;&gt;Rust in Action&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Tim McNamara&lt;/td&gt;&lt;td&gt;Manning, 2021&lt;/td&gt;&lt;td&gt;Practical systems cases&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://zero2prod.com&quot;&gt;Zero to Production in Rust&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Luca Palmieri&lt;/td&gt;&lt;td&gt;Self-published&lt;/td&gt;&lt;td&gt;Back-end architecture for production&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://marabos.nl/atomics&quot;&gt;Rust Atomics and Locks&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Mara Bos&lt;/td&gt;&lt;td&gt;O&#39;Reilly, 2023, with a free online version&lt;/td&gt;&lt;td&gt;Concurrency, useful for WebAssembly with threads&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://doc.rust-lang.org/nomicon&quot;&gt;The Rustonomicon&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The Rust team&lt;/td&gt;&lt;td&gt;Online, ongoing&lt;/td&gt;&lt;td&gt;Unsafe, aliasing, FFI&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Command-Line Rust&lt;/td&gt;&lt;td&gt;Ken Youens-Clark&lt;/td&gt;&lt;td&gt;O&#39;Reilly, 2022&lt;/td&gt;&lt;td&gt;Command-line tools&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Asynchronous Programming in Rust&lt;/td&gt;&lt;td&gt;Carl Fredrik Samson&lt;/td&gt;&lt;td&gt;Packt, February 2024&lt;/td&gt;&lt;td&gt;Futures, executors, epoll, kqueue and IOCP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hands-On Concurrency with Rust&lt;/td&gt;&lt;td&gt;Brian L. Troutwine&lt;/td&gt;&lt;td&gt;Packt, 2018&lt;/td&gt;&lt;td&gt;Concurrency&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;rust-and-webassembly&quot;&gt;Rust and WebAssembly&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Book&lt;/th&gt;&lt;th&gt;Authors&lt;/th&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;th&gt;Scope&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://rustwasm.github.io/book&quot;&gt;The Rust and WebAssembly Book&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Rust and WebAssembly Working Group&lt;/td&gt;&lt;td&gt;Online, archived in 2025&lt;/td&gt;&lt;td&gt;Browser: Game of Life, wasm-bindgen, wasm-pack&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://pragprog.com/titles/khrust&quot;&gt;Programming WebAssembly with Rust&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Kevin Hoffman&lt;/td&gt;&lt;td&gt;PragProg, 2019&lt;/td&gt;&lt;td&gt;Browser and custom hosts; does not cover the component model or WASI 0.2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Practical WebAssembly&lt;/td&gt;&lt;td&gt;Sendil Kumar Nellaiyapen&lt;/td&gt;&lt;td&gt;Packt, 2022&lt;/td&gt;&lt;td&gt;Rust and WebAssembly in the browser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Practical WebAssembly&lt;/td&gt;&lt;td&gt;Kassian Wren&lt;/td&gt;&lt;td&gt;O&#39;Reilly, 2024&lt;/td&gt;&lt;td&gt;WebAssembly for web developers; same title, different book&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://leanpub.com/webassembly&quot;&gt;WebAssembly with Rust&lt;/a&gt;&lt;/td&gt;&lt;td&gt;sendilkumarn&lt;/td&gt;&lt;td&gt;Leanpub&lt;/td&gt;&lt;td&gt;WAT, wabt, binaryen and toolchain&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Game Development with Rust and WebAssembly&lt;/td&gt;&lt;td&gt;Eric Smith&lt;/td&gt;&lt;td&gt;Packt, 2022&lt;/td&gt;&lt;td&gt;A 2D game in the browser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Creative Projects for Rust Programmers&lt;/td&gt;&lt;td&gt;Carlo Milanesi&lt;/td&gt;&lt;td&gt;Packt, 2020&lt;/td&gt;&lt;td&gt;Yew, WebAssembly games, REST&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://bpbonline.com/products/building-and-deploying-webassembly-apps&quot;&gt;Building and Deploying WebAssembly Apps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Peter Salomonsen&lt;/td&gt;&lt;td&gt;BPB, 2025&lt;/td&gt;&lt;td&gt;AssemblyScript, C, C++, Rust and Kubernetes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Watch out for the flood of AI-generated self-published books since 2023, with titles like &quot;Rust for WebAssembly&quot; and authors with dozens of books a year. Before buying, it is worth checking the publisher and whether the author has public code.&lt;/p&gt;
&lt;h3 id=&quot;webassembly-in-general&quot;&gt;WebAssembly in general&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Book&lt;/th&gt;&lt;th&gt;Authors&lt;/th&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;th&gt;Relevance for Rust users&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;WebAssembly: The Definitive Guide&lt;/td&gt;&lt;td&gt;Brian Sletten&lt;/td&gt;&lt;td&gt;O&#39;Reilly, 2021&lt;/td&gt;&lt;td&gt;High: language-independent fundamentals, WASI&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://nostarch.com/art-webassembly&quot;&gt;The Art of WebAssembly&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Rick Battagline&lt;/td&gt;&lt;td&gt;No Starch, 2021&lt;/td&gt;&lt;td&gt;High: WAT in depth, to read what Rust generates&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.manning.com/books/server-side-webassembly&quot;&gt;Server-Side WebAssembly&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Danilo Chiarlone&lt;/td&gt;&lt;td&gt;Manning&lt;/td&gt;&lt;td&gt;High: WASI on the server, Spin, edge&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.manning.com/books/webassembly-in-action&quot;&gt;WebAssembly in Action&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Gerard Gallant&lt;/td&gt;&lt;td&gt;Manning, 2019&lt;/td&gt;&lt;td&gt;Medium: focus on C and C++ with Emscripten&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Learn WebAssembly&lt;/td&gt;&lt;td&gt;Mike Rourke&lt;/td&gt;&lt;td&gt;Packt, 2018&lt;/td&gt;&lt;td&gt;Low: C and C++&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;What Is WebAssembly?&lt;/td&gt;&lt;td&gt;Colin Eberhardt&lt;/td&gt;&lt;td&gt;O&#39;Reilly&lt;/td&gt;&lt;td&gt;Medium: overview&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://nextpublishing.jp/book/18115.html&quot;&gt;WebAssembly System Interface入門&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Asuka Yagi&lt;/td&gt;&lt;td&gt;Impress NextPublishing, 2024&lt;/td&gt;&lt;td&gt;Medium: WASI 0.1 and 0.2, with examples in Go&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;in-portuguese&quot;&gt;In Portuguese&lt;/h3&gt;
&lt;p&gt;The only Brazilian book on WebAssembly with Rust I found is &lt;a rel=&quot;external&quot; href=&quot;https://casadocodigo.com.br/products/livro-webassembly&quot;&gt;Desmistificando WebAssembly&lt;/a&gt;, by Raphael Amorim, from Casa do Código, with &lt;a rel=&quot;external&quot; href=&quot;https://github.com/raphamorim/livro-webassembly-exemplos&quot;&gt;examples on GitHub&lt;/a&gt;. For Rust in general, there is the &lt;a rel=&quot;external&quot; href=&quot;https://novatec.com.br/livros/programacao-em-rust-2ed/&quot;&gt;translation of the 2nd edition of Programming Rust&lt;/a&gt;, from Novatec in 2023, and &lt;a rel=&quot;external&quot; href=&quot;https://novatec.com.br/livros/primeiros-passos-linguagem-rust/&quot;&gt;Primeiros Passos com a Linguagem Rust&lt;/a&gt;, by José Augusto Manzano, also from Novatec, from 2018. The community maintains a &lt;a rel=&quot;external&quot; href=&quot;https://rust-br.github.io/rust-book-pt-br&quot;&gt;translation of the official book&lt;/a&gt;. The rest depends on English.&lt;/p&gt;
&lt;h3 id=&quot;documentation-with-the-depth-of-a-book&quot;&gt;Documentation with the depth of a book&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Resource&lt;/th&gt;&lt;th&gt;Organization&lt;/th&gt;&lt;th&gt;Topics&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://wasm-bindgen.github.io/wasm-bindgen/&quot;&gt;wasm-bindgen Guide&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-bindgen&lt;/td&gt;&lt;td&gt;Interop between Rust and JavaScript&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://wasm-bindgen.github.io/wasm-pack/&quot;&gt;wasm-pack&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-bindgen&lt;/td&gt;&lt;td&gt;Build, test and publish to npm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://book.leptos.dev&quot;&gt;Leptos Book&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Leptos&lt;/td&gt;&lt;td&gt;Reactive UI, signals, SSR&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://dioxuslabs.com/learn/0.7/&quot;&gt;Dioxus&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Dioxus Labs&lt;/td&gt;&lt;td&gt;UI for web, desktop and mobile&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://yew.rs&quot;&gt;Yew&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yew&lt;/td&gt;&lt;td&gt;Components, hooks, routing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://sycamore.dev/&quot;&gt;Sycamore&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sycamore&lt;/td&gt;&lt;td&gt;Reactive framework with SSR&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://trunk-rs.github.io/trunk/&quot;&gt;Trunk&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Trunk&lt;/td&gt;&lt;td&gt;Build and bundling with hot reload&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.wasmtime.dev&quot;&gt;Wasmtime&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Bytecode Alliance&lt;/td&gt;&lt;td&gt;WASI, embedding, fuel&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://component-model.bytecodealliance.org&quot;&gt;Component Model&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Bytecode Alliance&lt;/td&gt;&lt;td&gt;Component model, WIT, WASI 0.2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developer.fermyon.com/spin&quot;&gt;Spin&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Fermyon&lt;/td&gt;&lt;td&gt;Serverless WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://extism.org/docs/overview&quot;&gt;Extism&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Extism&lt;/td&gt;&lt;td&gt;WebAssembly plugins&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.wasmer.io&quot;&gt;Wasmer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Wasmer&lt;/td&gt;&lt;td&gt;Runtime, WASI, embedding&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/WebAssembly/Guides/Rust_to_Wasm&quot;&gt;Compiling Rust to WebAssembly&lt;/a&gt;&lt;/td&gt;&lt;td&gt;MDN&lt;/td&gt;&lt;td&gt;First steps in the browser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://embedded-wasm.github.io/book&quot;&gt;Embedded WebAssembly Book&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Community&lt;/td&gt;&lt;td&gt;IoT and embedded&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;There is still no book on WASI 0.2 and the component model (only the Bytecode Alliance documentation), on the new frameworks like Leptos and Dioxus, or on security and fuzzing of WebAssembly modules, which today lives in academic papers, like &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2407.12297&quot;&gt;this one from 2024&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;people-and-visualization-projects-in-rust-and-webassembly&quot;&gt;People and visualization projects in Rust and WebAssembly&lt;/h2&gt;
&lt;h3 id=&quot;people&quot;&gt;People&lt;/h3&gt;
&lt;p&gt;The first version had each person&#39;s country and role, and errors: it attributed wgpu to two people as if they were one, gave another the wrong name, and listed two profiles that do not exist. I removed the country, which is personal data and which the source itself contradicted. I also removed the role, because what can be checked without depending on anyone&#39;s word is the contribution. In the table, each project was checked against the GitHub contributor list. Anyone with no confirmed link was left out.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Person&lt;/th&gt;&lt;th&gt;Projects where they appear as a contributor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/alexcrichton&quot;&gt;Alex Crichton&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime, wasm-bindgen, cargo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fitzgen&quot;&gt;Nick Fitzgerald&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime, wasm-bindgen, walrus, wasm-tools&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ashleygwilliams&quot;&gt;Ashley Williams&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-pack&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tschneidereit&quot;&gt;Till Schneidereit&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime, WASI&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lukewagner&quot;&gt;Luke Wagner&lt;/a&gt;&lt;/td&gt;&lt;td&gt;component-model&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sunfishcode&quot;&gt;Dan Gohman&lt;/a&gt;&lt;/td&gt;&lt;td&gt;WASI, wasi-libc, wasmtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cfallin&quot;&gt;Chris Fallin&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pchickey&quot;&gt;Pat Hickey&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime, wit-bindgen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/peterhuene&quot;&gt;Peter Huene&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-tools, wit-bindgen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/daxpedda&quot;&gt;daxpedda&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-bindgen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/guybedford&quot;&gt;Guy Bedford&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-bindgen, workers-rs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/drager&quot;&gt;Jesper Håkansson&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-pack&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/syrusakbary&quot;&gt;Syrus Akbary&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/withoutboats&quot;&gt;withoutboats&lt;/a&gt;&lt;/td&gt;&lt;td&gt;fehler&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/aturon&quot;&gt;Aaron Turon&lt;/a&gt;&lt;/td&gt;&lt;td&gt;tokio, rfcs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nikomatsakis&quot;&gt;Niko Matsakis&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust, polonius, chalk&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/steveklabnik&quot;&gt;Steve Klabnik&lt;/a&gt;&lt;/td&gt;&lt;td&gt;book&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/carols10cents&quot;&gt;Carol Nichols&lt;/a&gt;&lt;/td&gt;&lt;td&gt;book, crates.io&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/shepmaster&quot;&gt;Jake Goulding&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust-playground&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/manishearth&quot;&gt;Manish Goregaokar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust-clippy, unicode-segmentation, servo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pnkfelix&quot;&gt;Felix S Klock II&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/abrown&quot;&gt;Andrew Brown&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasmtime, wasi-nn&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/xtuc&quot;&gt;Sven Sauleau&lt;/a&gt;&lt;/td&gt;&lt;td&gt;workers-rs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RReverser&quot;&gt;Ingvar Stepanyan&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-bindgen&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jasonwilliams&quot;&gt;Jason Williams&lt;/a&gt;&lt;/td&gt;&lt;td&gt;boa&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bnjbvr&quot;&gt;Benjamin Bouvier&lt;/a&gt;&lt;/td&gt;&lt;td&gt;matrix-rust-sdk&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/hsivonen&quot;&gt;Henri Sivonen&lt;/a&gt;&lt;/td&gt;&lt;td&gt;encoding_rs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/eddyb&quot;&gt;Eduard-Mihai Burtescu&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust, rust-gpu&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/surma&quot;&gt;Surma&lt;/a&gt;&lt;/td&gt;&lt;td&gt;comlink, squoosh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/gbj&quot;&gt;Greg Johnston&lt;/a&gt;&lt;/td&gt;&lt;td&gt;leptos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jkelleyrtp&quot;&gt;Jonathan Kelley&lt;/a&gt;&lt;/td&gt;&lt;td&gt;dioxus&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/futursolo&quot;&gt;Kaede Hoshikawa&lt;/a&gt;&lt;/td&gt;&lt;td&gt;yew&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/emilk&quot;&gt;Emil Ernerfeldt&lt;/a&gt;&lt;/td&gt;&lt;td&gt;egui, rerun&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jonhoo&quot;&gt;Jon Gjengset&lt;/a&gt;&lt;/td&gt;&lt;td&gt;haphazard&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/LukeMathWalker&quot;&gt;Luca Palmieri&lt;/a&gt;&lt;/td&gt;&lt;td&gt;zero-to-production, cargo-chef&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/yoshuawuyts&quot;&gt;Yosh Wuyts&lt;/a&gt;&lt;/td&gt;&lt;td&gt;async-std, http-types, surf&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/killercup&quot;&gt;Pascal Hertleif&lt;/a&gt;&lt;/td&gt;&lt;td&gt;rust-cli book, diesel&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cart&quot;&gt;Carter Anderson&lt;/a&gt;&lt;/td&gt;&lt;td&gt;bevy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/mockersf&quot;&gt;François Mockers&lt;/a&gt;&lt;/td&gt;&lt;td&gt;bevy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Frizi&quot;&gt;Frizi&lt;/a&gt;&lt;/td&gt;&lt;td&gt;bevy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/kvark&quot;&gt;Dzmitry Malyshau&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wgpu&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/raphlinus&quot;&gt;Raph Levien&lt;/a&gt;&lt;/td&gt;&lt;td&gt;xilem, druid, kurbo, piet, vello&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/38&quot;&gt;Hao Hou&lt;/a&gt;&lt;/td&gt;&lt;td&gt;plotters&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/blitzarx1&quot;&gt;blitzarx1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;egui_graphs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/grantshandy&quot;&gt;Grant Handy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;fdg&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/RazrFalcon&quot;&gt;Yevhenii Reizner&lt;/a&gt;&lt;/td&gt;&lt;td&gt;resvg, tiny-skia, rustybuzz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/japaric&quot;&gt;Jorge Aparicio&lt;/a&gt;&lt;/td&gt;&lt;td&gt;cross, cortex-m&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dtolnay&quot;&gt;David Tolnay&lt;/a&gt;&lt;/td&gt;&lt;td&gt;serde, syn, cxx, thiserror&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/seanmonstar&quot;&gt;Sean McArthur&lt;/a&gt;&lt;/td&gt;&lt;td&gt;hyper, reqwest&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/MattiasBuelens&quot;&gt;Mattias Buelens&lt;/a&gt;&lt;/td&gt;&lt;td&gt;wasm-streams&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/torch2424&quot;&gt;Aaron Turner&lt;/a&gt;&lt;/td&gt;&lt;td&gt;assemblyscript, wasm-by-example&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/michaelsproul&quot;&gt;Michael Sproul&lt;/a&gt;&lt;/td&gt;&lt;td&gt;lighthouse&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/SimonSapin&quot;&gt;Simon Sapin&lt;/a&gt;&lt;/td&gt;&lt;td&gt;servo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/BurntSushi&quot;&gt;Andrew Gallant&lt;/a&gt;&lt;/td&gt;&lt;td&gt;ripgrep, regex&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/passcod&quot;&gt;Félix Saparelli&lt;/a&gt;&lt;/td&gt;&lt;td&gt;watchexec&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/badboy&quot;&gt;Jan-Erik Rediger&lt;/a&gt;&lt;/td&gt;&lt;td&gt;glean&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ipetkov&quot;&gt;Ivan Petkov&lt;/a&gt;&lt;/td&gt;&lt;td&gt;crane&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;graph-chart-and-visualization-projects&quot;&gt;Graph, chart and visualization projects&lt;/h3&gt;
&lt;p&gt;The projects on GitHub, with stars from the API. Renamed ones already show their new name.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GoogleChromeLabs/squoosh&quot;&gt;GoogleChromeLabs/squoosh&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;26,021&lt;/td&gt;&lt;td&gt;In-browser image optimization with WebAssembly codecs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/wasmerio/wasmer&quot;&gt;wasmerio/wasmer&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,152&lt;/td&gt;&lt;td&gt;WebAssembly runtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/bytecodealliance/wasmtime&quot;&gt;bytecodealliance/wasmtime&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;18,718&lt;/td&gt;&lt;td&gt;The Bytecode Alliance&#39;s WebAssembly runtime&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/jacomyal/sigma.js&quot;&gt;jacomyal/sigma.js&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12,187&lt;/td&gt;&lt;td&gt;WebGL rendering of large graphs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rerun-io/rerun&quot;&gt;rerun-io/rerun&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,590&lt;/td&gt;&lt;td&gt;Multimodal visualization for scientific and robotics data&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/perspective-dev/perspective&quot;&gt;perspective-dev/perspective&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,295&lt;/td&gt;&lt;td&gt;Interactive analytics and visualization with a WebAssembly core&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cytoscape/cytoscape.js&quot;&gt;cytoscape/cytoscape.js&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;11,237&lt;/td&gt;&lt;td&gt;Graph visualization in JavaScript&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/apache/datafusion&quot;&gt;apache/datafusion&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,444&lt;/td&gt;&lt;td&gt;Analytical query engine&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/wasm-bindgen/wasm-bindgen&quot;&gt;wasm-bindgen/wasm-bindgen&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,187&lt;/td&gt;&lt;td&gt;Interop between Rust, WebAssembly and JavaScript&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/EmbarkStudios/rust-gpu&quot;&gt;EmbarkStudios/rust-gpu&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,559&lt;/td&gt;&lt;td&gt;Rust compiled to SPIR-V; Embark&#39;s repository was archived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/wasm-bindgen/wasm-pack&quot;&gt;wasm-bindgen/wasm-pack&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,286&lt;/td&gt;&lt;td&gt;Packages Rust as an npm package&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nannou-org/nannou&quot;&gt;nannou-org/nannou&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6,766&lt;/td&gt;&lt;td&gt;Creative coding&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/observablehq/plot&quot;&gt;observablehq/plot&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5,403&lt;/td&gt;&lt;td&gt;Statistical charts from Observable&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/plotters-rs/plotters&quot;&gt;plotters-rs/plotters&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,631&lt;/td&gt;&lt;td&gt;Charts with canvas, SVG and bitmap back ends&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/mdaines/viz-js&quot;&gt;mdaines/viz-js&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,353&lt;/td&gt;&lt;td&gt;Graphviz compiled to WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/resvg&quot;&gt;linebender/resvg&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,123&lt;/td&gt;&lt;td&gt;SVG renderer in pure Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/petgraph/petgraph&quot;&gt;petgraph/petgraph&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4,029&lt;/td&gt;&lt;td&gt;Graph data structures, the base of egui_graphs and fdg&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/silvia-odwyer/photon&quot;&gt;silvia-odwyer/photon&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,909&lt;/td&gt;&lt;td&gt;Image processing in WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/servo/pathfinder&quot;&gt;servo/pathfinder&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,895&lt;/td&gt;&lt;td&gt;GPU font and vector rendering&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/yuankunzhang/charming&quot;&gt;yuankunzhang/charming&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,601&lt;/td&gt;&lt;td&gt;Rust charts on Apache ECharts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tgdwyer/WebCola&quot;&gt;tgdwyer/WebCola&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,099&lt;/td&gt;&lt;td&gt;Constraint-based graph layout&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/thx/resvg-js&quot;&gt;thx/resvg-js&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,998&lt;/td&gt;&lt;td&gt;resvg bindings for Node and the browser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/kiss3d&quot;&gt;dimforge/kiss3d&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,784&lt;/td&gt;&lt;td&gt;Simple 3D library&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/asny/three-d&quot;&gt;asny/three-d&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,678&lt;/td&gt;&lt;td&gt;3D renderer that compiles to WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/tiny-skia&quot;&gt;linebender/tiny-skia&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,657&lt;/td&gt;&lt;td&gt;Skia port in pure Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/plotly/plotly.rs&quot;&gt;plotly/plotly.rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,457&lt;/td&gt;&lt;td&gt;Plotly for Rust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/linebender/piet&quot;&gt;linebender/piet&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,376&lt;/td&gt;&lt;td&gt;2D rendering abstraction with several back ends&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/cosmosgl/graph&quot;&gt;cosmosgl/graph&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,296&lt;/td&gt;&lt;td&gt;GPU visualization of large graphs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/chartshq/muze&quot;&gt;chartshq/muze&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,184&lt;/td&gt;&lt;td&gt;Composable data visualization; archived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tremor-rs/tremor-runtime&quot;&gt;tremor-rs/tremor-runtime&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;933&lt;/td&gt;&lt;td&gt;Event stream processing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/blitzarx1/egui_graphs&quot;&gt;blitzarx1/egui_graphs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;708&lt;/td&gt;&lt;td&gt;Interactive graph widget for egui, on petgraph&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/alceal/plotlars&quot;&gt;alceal/plotlars&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;671&lt;/td&gt;&lt;td&gt;Bridges Polars and Plotly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rosslh/Mandelbrot.site&quot;&gt;rosslh/Mandelbrot.site&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;330&lt;/td&gt;&lt;td&gt;Mandelbrot set explorer in the browser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/rustwasm/wasm_game_of_life&quot;&gt;rustwasm/wasm_game_of_life&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;288&lt;/td&gt;&lt;td&gt;Game of Life tutorial in Rust and WebAssembly; archived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/grantshandy/fdg&quot;&gt;grantshandy/fdg&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;232&lt;/td&gt;&lt;td&gt;Force-directed graph layout&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Joylei/plotters-iced&quot;&gt;Joylei/plotters-iced&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;205&lt;/td&gt;&lt;td&gt;plotters back end for iced apps&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/mazznoer/colorgrad-js&quot;&gt;mazznoer/colorgrad-js&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;172&lt;/td&gt;&lt;td&gt;Color gradients in Rust and WebAssembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/feral-dot-io/leptos-chartistry&quot;&gt;feral-dot-io/leptos-chartistry&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;147&lt;/td&gt;&lt;td&gt;Charts for Leptos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/brson/wasm-opt-rs&quot;&gt;brson/wasm-opt-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;100&lt;/td&gt;&lt;td&gt;Bindings for the wasm-opt optimizer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/angular-rust/ux-charts&quot;&gt;angular-rust/ux-charts&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;&lt;td&gt;Responsive canvas charts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/plotters-rs/plotters-canvas&quot;&gt;plotters-rs/plotters-canvas&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;38&lt;/td&gt;&lt;td&gt;HTML5 canvas back end for plotters&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Billy-Sheppard/chart-js-rs&quot;&gt;Billy-Sheppard/chart-js-rs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;28&lt;/td&gt;&lt;td&gt;Chart.js bindings&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Outside GitHub, as crates: &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/forge-charts&quot;&gt;forge-charts&lt;/a&gt; makes interactive SVG charts for Leptos without JavaScript; &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/mermaid-rs-renderer&quot;&gt;mermaid-rs-renderer&lt;/a&gt; renders Mermaid diagrams in pure Rust and claims to be 100 to 1,400 times faster than mermaid-cli; &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/dagre&quot;&gt;dagre&lt;/a&gt; ports dagre&#39;s Sugiyama layout; and &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/web-sys&quot;&gt;web-sys&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/js-sys&quot;&gt;js-sys&lt;/a&gt; are the bindings for web APIs and JavaScript objects, maintained inside wasm-bindgen. On the commercial side, &lt;a rel=&quot;external&quot; href=&quot;https://ogma.linkurious.com&quot;&gt;Ogma&lt;/a&gt;, from Linkurious, is a WebGL graph engine.&lt;/p&gt;
&lt;h3 id=&quot;what-i-take-from-it-1&quot;&gt;What I take from it&lt;/h3&gt;
&lt;p&gt;Visualization in Rust and WebAssembly splits into four groups. GPU rendering: wgpu, vello, three-d, bevy. Charts and dashboards tied to web frameworks: plotters, plotlars, charming, leptos-chartistry. Graphs: petgraph, egui_graphs, fdg, dagre. And scientific visualization: rerun, resvg, tiny-skia.&lt;/p&gt;
&lt;p&gt;Graphs are the weakest group. There is no mature equivalent of networkx or d3-force in Rust with WebAssembly, and advanced layout, hierarchical or Sugiyama, is still rare. For large, dynamic graphs in the browser, JavaScript is still ahead with sigma.js and cytoscape.js. And there is little material in Portuguese linking Rust and WebAssembly to data visualization. A Portuguese-speaking community exists, like the &lt;a rel=&quot;external&quot; href=&quot;https://t.me/rustlangbr&quot;&gt;Rust Brasil group on Telegram&lt;/a&gt;, but I found no Brazilian visualization project with international traction.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Design systems for neurodivergent people: what the evidence says about typography, colour and layout</title>
        <published>2025-05-12T00:00:00+00:00</published>
        <updated>2025-05-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/design-system-neurodivergente/"/>
        <id>https://brennercruvinel.blog/en/blog/design-system-neurodivergente/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/design-system-neurodivergente/">&lt;p&gt;This is the evidence review behind the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/hoff-nds/&quot;&gt;Hoff NDS&lt;/a&gt;, the design system I use in Hoff Research products, and behind the interface decisions in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/musica-aurora/&quot;&gt;Aurora app&lt;/a&gt;. For each topic: what the study measured, with how many people, and how much I trust it.&lt;/p&gt;
&lt;h2 id=&quot;typography&quot;&gt;Typography&lt;/h2&gt;
&lt;p&gt;Fonts for neurodivergence is a topic full of commercial promises. Controlled research takes most of them apart.&lt;/p&gt;
&lt;p&gt;Wery and Diliberto tested OpenDyslexic with elementary students with dyslexia in an alternating treatment design, against Arial and Times New Roman.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-wery-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-wery&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; There was no gain in speed or accuracy, individually or as a group, and no participant said they preferred reading in it. The sample is small, but the design is rigorous.&lt;/p&gt;
&lt;p&gt;Kuster and colleagues did the same with Dyslexie, the font sold to schools.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-kuster-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-kuster&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; In the first experiment, 170 children with dyslexia did not read faster or with fewer errors in Dyslexie than in Arial. In the second, 102 children with dyslexia and 45 without read word lists in Dyslexie, Arial and Times New Roman: again no gain, and most preferred Arial or Times.&lt;/p&gt;
&lt;p&gt;Rello and Baeza-Yates used eye-tracking on 48 readers with dyslexia across 12 fonts.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-rello-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-rello&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; Sans-serif, monospaced and roman styles improved reading; italic made it worse; OpenDyslexic brought no gain. The British Dyslexia Association style guide points the same way and recommends ordinary sans-serif, such as Arial, Verdana and Open Sans.&lt;/p&gt;
&lt;p&gt;For ADHD the evidence is thinner. Phalke, Shrivastava and Sahgal tested five children with ADHD on nine combinations of font size and type, with remedial experts estimating attention span from video.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-phalke-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-phalke&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt; Font type had a significant effect and size a marginal one. With five children, it is a clue, not a rule.&lt;/p&gt;
&lt;p&gt;For size, Will Soward&#39;s Neurodiversity Design System recommends body text of 16 to 20px and line height of 150% to 170%.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-ndstype-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-ndstype&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;spacing&quot;&gt;Spacing&lt;/h2&gt;
&lt;p&gt;Letter spacing is the most solid finding in the field. Zorzi and colleagues increased the space between letters by 2.5 points for Italian and French children with dyslexia, aged 8 to 14, with no training at all.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-zorzi-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-zorzi&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt; The CNRS summary describes the result as half the errors and 20% faster reading. The explanation is crowding: neighbouring letters interfere with recognizing the target letter, and readers with dyslexia are more affected by it.&lt;/p&gt;
&lt;p&gt;The effect was replicated in adults. Sjoblom, Eaton and Stagg tested 24 university students with dyslexia and 24 without: wide spacing improved everyone&#39;s speed and the accuracy of the readers with dyslexia.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-sjoblom-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-sjoblom&quot;&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Galliussi and colleagues added nuance, with two groups of 64 children, with and without dyslexia, combining letter and word spacing.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-galliussi-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-galliussi&quot;&gt;[8]&lt;/a&gt;&lt;/sup&gt; Spacing has to be treated as a system, not as an isolated tweak.&lt;/p&gt;
&lt;p&gt;Line height has weaker evidence. The studies collected by CAST disagree: in one, tighter line spacing made reading slower; in another, it did not change readability.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-cast-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-cast&quot;&gt;[9]&lt;/a&gt;&lt;/sup&gt; So I anchor on WCAG success criterion 1.4.12, which requires content to work with line height of 1.5, 0.12em letter spacing and 0.16em word spacing.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-textspacing-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-textspacing&quot;&gt;[10]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;colour-and-contrast&quot;&gt;Colour and contrast&lt;/h2&gt;
&lt;p&gt;Grandgeorge and Masataka asked 29 autistic boys and 38 typically developing boys, aged 4 to 17, which of six colours they preferred.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-grandgeorge-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-grandgeorge&quot;&gt;[11]&lt;/a&gt;&lt;/sup&gt; The autistic boys chose yellow less and green and brown more. The authors link this to sensory hypersensitivity. The sample is boys only.&lt;/p&gt;
&lt;p&gt;Nair and colleagues surveyed 87 autistic children aged 6 to 16 about colour and light in the built environment.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-nair-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-nair&quot;&gt;[12]&lt;/a&gt;&lt;/sup&gt; Preferences varied widely; neutral and soft tones tended to calm, and intense colour and bright light tended to stimulate. It is a case study, not an experiment.&lt;/p&gt;
&lt;p&gt;In ADHD, the clue is neurobiological. Banaschewski and colleagues tested 14 children with ADHD and 13 without: those with ADHD made more errors on the Farnsworth-Munsell test, mostly on the blue-yellow axis.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-banaschewski-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-banaschewski&quot;&gt;[13]&lt;/a&gt;&lt;/sup&gt; The hypothesis is retinal dopaminergic hypofunction, which affects S-cones. Kim and colleagues, with 30 young adults with ADHD, found poorer discrimination of blue and red saturation in women with ADHD.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-kim2014-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-kim2014&quot;&gt;[14]&lt;/a&gt;&lt;/sup&gt; In a pilot visual evoked potential study with 16 adolescents with ADHD and 15 without, the P1 amplitude was larger for blue and yellow stimuli in the ADHD group, which the authors read as possible compensation.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-kimvep-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-kimvep&quot;&gt;[15]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The Neurodiversity Design System asks for a contrast of at least 4.5:1 and 7:1 for body text, warns that pure black on pure white increases fatigue for people with visual stress, and suggests a mode where the person picks hue and saturation.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-ndscolour-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-ndscolour&quot;&gt;[16]&lt;/a&gt;&lt;/sup&gt; The UK government accessibility blog records the same conflict: some autistic people prefer reduced contrast, people with low vision need high contrast.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-govuk-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-govuk&quot;&gt;[17]&lt;/a&gt;&lt;/sup&gt; The way out is personalization.&lt;/p&gt;
&lt;h2 id=&quot;touch-targets&quot;&gt;Touch targets&lt;/h2&gt;
&lt;p&gt;WCAG 2.5.8 sets 24 by 24 CSS pixels as the minimum.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-wcagtarget-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-wcagtarget&quot;&gt;[18]&lt;/a&gt;&lt;/sup&gt; Nielsen Norman Group recommends at least 1cm by 1cm for adults&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-nngtarget-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-nngtarget&quot;&gt;[19]&lt;/a&gt;&lt;/sup&gt; and 2cm by 2cm for young children, based on tests with children aged 3 to 12, in which precise dragging was hard.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-nngchild-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-nngchild&quot;&gt;[20]&lt;/a&gt;&lt;/sup&gt; Android recommends 48dp, about 9mm.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-material-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-material&quot;&gt;[21]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The TIDRC framework, by Soni and colleagues, gathered 57 touch interface recommendations for children aged 2 to 11 and analysed 50 children&#39;s iPad apps: on average only 63% followed the recommendations, and 67% for the physical ones.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-tidrc-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-tidrc&quot;&gt;[22]&lt;/a&gt;&lt;/sup&gt; Guo and colleagues, with 31 adults on a 65-inch screen, found the best time with 70mm buttons, fewest errors with 50mm and most satisfaction with 90mm.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-guo-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-guo&quot;&gt;[23]&lt;/a&gt;&lt;/sup&gt; It is a large screen and adults, but it reinforces that larger targets reduce errors.&lt;/p&gt;
&lt;h2 id=&quot;animation-and-motion&quot;&gt;Animation and motion&lt;/h2&gt;
&lt;p&gt;This part is about health. WCAG 2.3.1 forbids content that flashes more than three times per second, because of the risk of photosensitive seizures.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-flash-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-flash&quot;&gt;[24]&lt;/a&gt;&lt;/sup&gt; The Pokémon episode aired in Japan in 1997 is the case everyone cites.&lt;/p&gt;
&lt;p&gt;Alzahrani, Uitdenbogerd and Spichkova compared autistic and non-autistic people doing tasks with irrelevant animation on screen.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-alzahrani-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-alzahrani&quot;&gt;[25]&lt;/a&gt;&lt;/sup&gt; Animation hurt the performance of both groups, and more so that of autistic people, who were more distracted and reported more effort and frustration.&lt;/p&gt;
&lt;p&gt;The established technical solution is to respect &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, replacing motion with a simple opacity transition.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mdn-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-mdn&quot;&gt;[26]&lt;/a&gt;&lt;/sup&gt; Val Head sums up the WCAG guidance: avoid unnecessary animation and give control to turn off non-essential motion.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-valhead-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-valhead&quot;&gt;[27]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-i-apply&quot;&gt;What I apply&lt;/h2&gt;
&lt;p&gt;For an app aimed at all children, including neurodivergent ones, the order the evidence supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A good ordinary sans-serif, such as Open Sans, at 16 to 20px. No paid special font&lt;/li&gt;
&lt;li&gt;Spacing treated as a system, at the WCAG 1.4.12 values or above&lt;/li&gt;
&lt;li&gt;A soft palette, 7:1 contrast on text when possible, and at least three themes&lt;/li&gt;
&lt;li&gt;A minimum target of 60px for the main action in a children&#39;s app, with 8 to 16px between targets&lt;/li&gt;
&lt;li&gt;Minimal, slow, predictable animation, with &lt;code&gt;prefers-reduced-motion&lt;/code&gt; and a dedicated switch to turn it off&lt;/li&gt;
&lt;li&gt;A clean layout, clear hierarchy and navigation that does not move&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this converges with &lt;a rel=&quot;external&quot; href=&quot;https://www.w3.org/WAI/standards-guidelines/wcag/&quot;&gt;WCAG&lt;/a&gt; and with the &lt;a rel=&quot;external&quot; href=&quot;https://www.w3.org/WAI/cognitive/&quot;&gt;W3C cognitive accessibility guidance&lt;/a&gt;. And nothing replaces testing with real neurodivergent children.&lt;/p&gt;
&lt;h3 id=&quot;about-learning-styles&quot;&gt;About learning styles&lt;/h3&gt;
&lt;p&gt;Many people say &quot;I am visual&quot; with the VARK model in mind, from Neil Fleming and Colleen Mills in 1992, which splits preference into visual, aural, read/write and kinesthetic.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-vark-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-vark&quot;&gt;[28]&lt;/a&gt;&lt;/sup&gt; The preference exists. What has no support is the hypothesis that teaching in the preferred style improves learning: the review by Pashler and colleagues, from 2008, found no solid evidence for it.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-pashler-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-pashler&quot;&gt;[29]&lt;/a&gt;&lt;/sup&gt; I use VARK as a reminder to vary the channel, not as a prescription.&lt;/p&gt;
&lt;h2 id=&quot;where-design-has-not-reached-yet&quot;&gt;Where design has not reached yet&lt;/h2&gt;
&lt;p&gt;In 2026 I came back to this review with a different question: what does research already know that no design system implements? Reviewing it now, some of these gaps have been partly closed, and I say which.&lt;/p&gt;
&lt;h3 id=&quot;intent-as-a-token&quot;&gt;Intent as a token&lt;/h3&gt;
&lt;p&gt;Design tokens encode appearance: colour, space, type, radius. The Design Tokens Community Group published the first stable version of its format in October 2025.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-dtcg-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-dtcg&quot;&gt;[30]&lt;/a&gt;&lt;/sup&gt; The types are still visual. A destructive button that should change motion, copy and ARIA at once still depends on team convention, not on a property of the system. I did not find a specification that treats intent as a token dimension.&lt;/p&gt;
&lt;h3 id=&quot;motion-as-a-state-graph&quot;&gt;Motion as a state graph&lt;/h3&gt;
&lt;p&gt;Rive came close: state machines with inputs controlled from code, and runtimes for web, iOS, Android and other platforms.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-rive-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-rive&quot;&gt;[31]&lt;/a&gt;&lt;/sup&gt; What is still missing is an open, text-based format where the transition is derived from the interface state, not from an animation file drawn in an editor. Framer Motion, GSAP and CSS animation are still runtime code, and moving a Framer Motion transition to SwiftUI still means rewriting it.&lt;/p&gt;
&lt;h3 id=&quot;physics-as-a-global-parameter&quot;&gt;Physics as a global parameter&lt;/h3&gt;
&lt;p&gt;The first version of this list said that no public design system treated spring and damping as root tokens. It was wrong: Material 3 Expressive, from 2025, already did that, and component motion comes from spring tokens with stiffness and damping, in expressive and standard schemes.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-m3-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-m3&quot;&gt;[32]&lt;/a&gt;&lt;/sup&gt; The gap that remains is smaller: a single physical model, with mass and friction, that applies to everything and is open outside the Android ecosystem. The academic groundwork has existed for decades, from Chang and Ungar, 1993, on cartoon animation principles applied to the interface,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-changungar-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-changungar&quot;&gt;[33]&lt;/a&gt;&lt;/sup&gt; to Hurtienne and Israel, 2007, on image schemas.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-hurtienne-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-hurtienne&quot;&gt;[34]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id=&quot;cognitive-cost-in-ci&quot;&gt;Cognitive cost in CI&lt;/h3&gt;
&lt;p&gt;Visual regression has Chromatic, Percy and Playwright visual diffs. Cognitive regression has no equivalent. CogTool, by John and colleagues, 2004, implemented the KLM model as a standalone tool and never made it into a versioned pipeline.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-cogtool-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-cogtool&quot;&gt;[35]&lt;/a&gt;&lt;/sup&gt; Fitts&#39;s law shows up in design guidelines, but I did not find a public linter or test runner that uses it as an assertion.&lt;/p&gt;
&lt;h3 id=&quot;components-readable-by-agents&quot;&gt;Components readable by agents&lt;/h3&gt;
&lt;p&gt;ARIA solves navigation for screen readers. An AI agent needs more: the precondition of an action, its effect on state, the cost of undoing it. Today agents make up for this by reading screenshots. The closest step is WebMCP, a draft from a W3C community group with editors from Google and Microsoft, which lets a page register tools with an input schema for agents.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-webmcp-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-webmcp&quot;&gt;[36]&lt;/a&gt;&lt;/sup&gt; It is progress at the page level. At the component level, declaring domain effect for humans, screen readers and agents at the same time, I did not find a specification.&lt;/p&gt;
&lt;h3 id=&quot;a-design-system-with-a-rust-runtime&quot;&gt;A design system with a Rust runtime&lt;/h3&gt;
&lt;p&gt;Every design system I know assumes the DOM. Vello renders 2D on the GPU in Rust, Tauri uses Rust but renders in a WebView, Makepad is a toolkit, and AccessKit solved portable accessibility in Rust. What is missing is the component layer with behaviour, state and accessibility on top of that, as a complete design system.&lt;/p&gt;
&lt;h3 id=&quot;scales-derived-from-perception&quot;&gt;Scales derived from perception&lt;/h3&gt;
&lt;p&gt;Scales like Tailwind&#39;s or the major third are good heuristics, but they are not derived from how the eye perceives difference. OKLCH solved perceptual uniformity for colour and is in CSS Color 4. What is missing is composing colour, space, type and time into a single system derived from vision models, such as Watson and Ahumada&#39;s contrast detection model, 2005,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-watson-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-watson&quot;&gt;[37]&lt;/a&gt;&lt;/sup&gt; or Lubin&#39;s visual discrimination model, 1995.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-lubin-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-lubin&quot;&gt;[38]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id=&quot;emotional-state-as-a-parameter&quot;&gt;Emotional state as a parameter&lt;/h3&gt;
&lt;p&gt;There are continuous models of affect, Russell&#39;s circumplex, 1980,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-russell-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-russell&quot;&gt;[39]&lt;/a&gt;&lt;/sup&gt; and Mehrabian&#39;s PAD space, 1996,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mehrabian-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-mehrabian&quot;&gt;[40]&lt;/a&gt;&lt;/sup&gt; and there is research inferring mood from mouse and keyboard, such as Zimmermann and colleagues, 2003.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-zimmermann-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fn-zimmermann&quot;&gt;[41]&lt;/a&gt;&lt;/sup&gt; I did not find the full pipeline in any product or open project: interaction signal, position in affective space, token adjustment in real time, calibrated to each person&#39;s baseline. Separating the baseline from the affective deviation is an online learning problem nobody has solved publicly.&lt;/p&gt;
&lt;p&gt;These gaps are why the NDS exists as a skeleton I apply, sometimes silently, in every new project. The specification is in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/hoff-nds/&quot;&gt;Hoff NDS post&lt;/a&gt;.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-wery&quot;&gt;
&lt;p&gt;Wery and Diliberto, &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC5629233/&quot;&gt;The effect of a specialized dyslexia font, OpenDyslexic, on reading rate and accuracy&lt;/a&gt;, Annals of Dyslexia, 2017. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-wery-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-kuster&quot;&gt;
&lt;p&gt;Kuster and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC5934461/&quot;&gt;Dyslexie font does not benefit reading in children with or without dyslexia&lt;/a&gt;, Annals of Dyslexia, 2018. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-kuster-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-rello&quot;&gt;
&lt;p&gt;Rello and Baeza-Yates, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/2513383.2513447&quot;&gt;Good fonts for dyslexia&lt;/a&gt;, ASSETS 2013. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-rello-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-phalke&quot;&gt;
&lt;p&gt;Phalke, Shrivastava and Sahgal, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.18848/2325-1581/CGP/v17i01/43-60&quot;&gt;Identification of Digital Font Size and Font Type to Enhance the Attention Span of Children Living with ADHD&lt;/a&gt;, International Journal of Visual Design, 2023. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-phalke-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-ndstype&quot;&gt;
&lt;p&gt;Will Soward, Neurodiversity Design System, &lt;a rel=&quot;external&quot; href=&quot;https://neurodiversity.design/principles/typography/&quot;&gt;typography&lt;/a&gt;, CC BY 4.0. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-ndstype-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-zorzi&quot;&gt;
&lt;p&gt;Zorzi and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1073/pnas.1205566109&quot;&gt;Extra-large letter spacing improves reading in dyslexia&lt;/a&gt;, PNAS, 2012. Numbers from the &lt;a rel=&quot;external&quot; href=&quot;https://www.sciencedaily.com/releases/2012/06/120607105712.htm&quot;&gt;CNRS summary&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-zorzi-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-sjoblom&quot;&gt;
&lt;p&gt;Sjoblom, Eaton and Stagg, &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/27629067/&quot;&gt;The effects of letter spacing and coloured overlays on reading speed and accuracy in adult dyslexia&lt;/a&gt;, British Journal of Educational Psychology, 2016. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-sjoblom-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-galliussi&quot;&gt;
&lt;p&gt;Galliussi and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1007/s11881-020-00194-x&quot;&gt;Inter-letter spacing, inter-word spacing, and font with dyslexia-friendly features&lt;/a&gt;, Annals of Dyslexia, 2020. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-galliussi-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-cast&quot;&gt;
&lt;p&gt;CAST, &lt;a rel=&quot;external&quot; href=&quot;https://cisl.cast.org/research/adjustable-line-spacing&quot;&gt;Adjustable line spacing&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-cast-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-textspacing&quot;&gt;
&lt;p&gt;W3C, &lt;a rel=&quot;external&quot; href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/text-spacing.html&quot;&gt;Understanding SC 1.4.12: Text Spacing&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-textspacing-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-grandgeorge&quot;&gt;
&lt;p&gt;Grandgeorge and Masataka, &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC5179595/&quot;&gt;Atypical Color Preference in Children with Autism Spectrum Disorder&lt;/a&gt;, Frontiers in Psychology, 2016. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-grandgeorge-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-nair&quot;&gt;
&lt;p&gt;Nair and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://www.frontiersin.org/journals/psychiatry/articles/10.3389/fpsyt.2022.1042641/full&quot;&gt;A case study on the effect of light and colors in the built environment on autistic children&#39;s behavior&lt;/a&gt;, Frontiers in Psychiatry, 2022. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-nair-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-banaschewski&quot;&gt;
&lt;p&gt;Banaschewski and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/16712633/&quot;&gt;Colour perception in ADHD&lt;/a&gt;, Journal of Child Psychology and Psychiatry, 2006. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-banaschewski-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-kim2014&quot;&gt;
&lt;p&gt;Kim and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1186/1744-9081-10-38&quot;&gt;Colour vision in ADHD: part 1, testing the retinal dopaminergic hypothesis&lt;/a&gt;, Behavioral and Brain Functions, 2014. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-kim2014-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-kimvep&quot;&gt;
&lt;p&gt;Kim, Banaschewski and Tannock, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1016/j.optom.2014.10.002&quot;&gt;Color vision in attention-deficit/hyperactivity disorder: a pilot visual evoked potential study&lt;/a&gt;, Journal of Optometry, 2015. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-kimvep-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-ndscolour&quot;&gt;
&lt;p&gt;Will Soward, Neurodiversity Design System, &lt;a rel=&quot;external&quot; href=&quot;https://neurodiversity.design/principles/colour/&quot;&gt;colour&lt;/a&gt;, CC BY 4.0. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-ndscolour-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-govuk&quot;&gt;
&lt;p&gt;Gov.uk, &lt;a rel=&quot;external&quot; href=&quot;https://accessibility.blog.gov.uk/2016/09/02/dos-and-donts-on-designing-for-accessibility/&quot;&gt;Dos and don&#39;ts on designing for accessibility&lt;/a&gt;, 2016. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-govuk-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-wcagtarget&quot;&gt;
&lt;p&gt;W3C, &lt;a rel=&quot;external&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html&quot;&gt;Understanding SC 2.5.8: Target Size (Minimum)&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-wcagtarget-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-nngtarget&quot;&gt;
&lt;p&gt;Nielsen Norman Group, &lt;a rel=&quot;external&quot; href=&quot;https://www.nngroup.com/articles/touch-target-size/&quot;&gt;Touch Targets on Touchscreens&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-nngtarget-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-nngchild&quot;&gt;
&lt;p&gt;Nielsen Norman Group, &lt;a rel=&quot;external&quot; href=&quot;https://www.nngroup.com/articles/children-ux-physical-development/&quot;&gt;Physical Development in Children&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-nngchild-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-material&quot;&gt;
&lt;p&gt;Google, &lt;a rel=&quot;external&quot; href=&quot;https://support.google.com/accessibility/android/answer/7101858&quot;&gt;Touch target size&lt;/a&gt;, Android accessibility. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-material-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-tidrc&quot;&gt;
&lt;p&gt;Soni and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://init.cise.ufl.edu/wp-content/uploads/sites/378/2019/04/TIDRC-Framework-soni-et-al-IDC19-final.pdf&quot;&gt;A Framework of Touchscreen Interaction Design Recommendations for Children (TIDRC)&lt;/a&gt;, IDC 2019. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-tidrc-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-guo&quot;&gt;
&lt;p&gt;Guo and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/36762820/&quot;&gt;Influence of size and location of buttons on the usability of interface on large touch screens&lt;/a&gt;, Ergonomics, 2023. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-guo-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-flash&quot;&gt;
&lt;p&gt;W3C, &lt;a rel=&quot;external&quot; href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/three-flashes-or-below-threshold.html&quot;&gt;Understanding SC 2.3.1: Three Flashes or Below Threshold&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-flash-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-alzahrani&quot;&gt;
&lt;p&gt;Alzahrani, Uitdenbogerd and Spichkova, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/3510458.3513007&quot;&gt;Impact of animated objects on autistic and non-autistic users&lt;/a&gt;, ICSE-SEIS 2022. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-alzahrani-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-mdn&quot;&gt;
&lt;p&gt;MDN, &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries_for_accessibility&quot;&gt;Using media queries for accessibility&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-mdn-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-valhead&quot;&gt;
&lt;p&gt;Val Head, &lt;a rel=&quot;external&quot; href=&quot;https://css-tricks.com/accessible-web-animation-the-wcag-on-animation-explained/&quot;&gt;Accessible Web Animation: The WCAG on Animation Explained&lt;/a&gt;, CSS-Tricks. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-valhead-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-vark&quot;&gt;
&lt;p&gt;Fleming and Mills, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1002/j.2334-4822.1992.tb00213.x&quot;&gt;Not Another Inventory, Rather a Catalyst for Reflection&lt;/a&gt;, To Improve the Academy, 1992. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-vark-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-pashler&quot;&gt;
&lt;p&gt;Pashler and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1111/j.1539-6053.2009.01038.x&quot;&gt;Learning Styles: Concepts and Evidence&lt;/a&gt;, Psychological Science in the Public Interest, 2008. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-pashler-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-dtcg&quot;&gt;
&lt;p&gt;Design Tokens Community Group, &lt;a rel=&quot;external&quot; href=&quot;https://www.designtokens.org/faq/&quot;&gt;FAQ&lt;/a&gt;, on stable version 2025.10. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-dtcg-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-rive&quot;&gt;
&lt;p&gt;Rive, &lt;a rel=&quot;external&quot; href=&quot;https://rive.app/docs/runtimes/web/rive-parameters&quot;&gt;web runtime documentation&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-rive-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-m3&quot;&gt;
&lt;p&gt;Material Design, &lt;a rel=&quot;external&quot; href=&quot;https://m3.material.io/blog/m3-expressive-motion-theming&quot;&gt;M3 Expressive: new motion system&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-m3-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-changungar&quot;&gt;
&lt;p&gt;Chang and Ungar, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/168642.168647&quot;&gt;Animation: from cartoons to the user interface&lt;/a&gt;, UIST 1993. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-changungar-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-hurtienne&quot;&gt;
&lt;p&gt;Hurtienne and Israel, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/1226969.1226996&quot;&gt;Image schemas and their metaphorical extensions&lt;/a&gt;, TEI 2007. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-hurtienne-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-cogtool&quot;&gt;
&lt;p&gt;John and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1145/985692.985750&quot;&gt;Predictive human performance modeling made easy&lt;/a&gt;, CHI 2004. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-cogtool-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-webmcp&quot;&gt;
&lt;p&gt;W3C Web Machine Learning Community Group, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/webmachinelearning/webmcp&quot;&gt;WebMCP&lt;/a&gt;. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-webmcp-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-watson&quot;&gt;
&lt;p&gt;Watson and Ahumada, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1167/5.9.6&quot;&gt;A standard model for foveal detection of spatial contrast&lt;/a&gt;, Journal of Vision, 2005. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-watson-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-lubin&quot;&gt;
&lt;p&gt;Lubin, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1142/9789812831200_0010&quot;&gt;A visual discrimination model for imaging system design and evaluation&lt;/a&gt;, 1995. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-lubin-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-russell&quot;&gt;
&lt;p&gt;Russell, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1037/h0077714&quot;&gt;A circumplex model of affect&lt;/a&gt;, Journal of Personality and Social Psychology, 1980. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-russell-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-mehrabian&quot;&gt;
&lt;p&gt;Mehrabian, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1007/bf02686918&quot;&gt;Pleasure-arousal-dominance&lt;/a&gt;, Current Psychology, 1996. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-mehrabian-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-zimmermann&quot;&gt;
&lt;p&gt;Zimmermann and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1080/10803548.2003.11076589&quot;&gt;Affective Computing, a Rationale for Measuring Mood With Mouse and Keyboard&lt;/a&gt;, 2003. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/#fr-zimmermann-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hoff NDS: the specification of Hoff Research&#39;s neurodivergent design system</title>
        <published>2025-05-12T00:00:00+00:00</published>
        <updated>2025-05-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/hoff-nds/"/>
        <id>https://brennercruvinel.blog/en/blog/hoff-nds/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/hoff-nds/">&lt;p&gt;Work in progress (WIP): this specification is still changing.&lt;/p&gt;
&lt;p&gt;This is Hoff NDS, the design system I use in &lt;a href=&quot;https://brennercruvinel.blog/en/blog/poc-hoff-triagem-neuropsicologica/&quot;&gt;Hoff Research products&lt;/a&gt; and apply, sometimes silently, to every new project. The evidence behind each rule is in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/&quot;&gt;post on design systems for neurodivergent people&lt;/a&gt;. This post holds only the norm.&lt;/p&gt;
&lt;h2 id=&quot;purpose-and-scope&quot;&gt;Purpose and scope&lt;/h2&gt;
&lt;p&gt;The system exists to reduce cognitive load, anxiety and error in digital interfaces, putting neurodivergent people first and benefiting everyone. It covers three kinds of limitation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permanent, such as low vision, dyslexia and autism&lt;/li&gt;
&lt;li&gt;Temporary, such as injury, fatigue and medication effects&lt;/li&gt;
&lt;li&gt;Situational, such as a noisy place, a bad connection and stress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The premise: learning and deciding happen in the brain, not on the screen. Every bit of effort spent decoding the interface is effort taken from the real task. Design&#39;s job is to lower the cost of reading, navigating and deciding.&lt;/p&gt;
&lt;p&gt;It is not a visual theme. It is a set of rules with reasons. Each section states the rule, the reason, the neurotypes it serves and the UX principles behind it. When a rule has a number, the number is normative.&lt;/p&gt;
&lt;h2 id=&quot;foundations&quot;&gt;Foundations&lt;/h2&gt;
&lt;p&gt;Cognitive load. People with ADHD perform worse and vary more in reaction time under high load. So only what serves the screen&#39;s goal stays visible. If an element does not inform the task, it distracts from it.&lt;/p&gt;
&lt;p&gt;Good stress and bad stress. There is a level of tension that helps focus and a level that paralyses. The interface absorbs the stress of operating, searching and making mistakes, so the person&#39;s tension goes to the content.&lt;/p&gt;
&lt;p&gt;Predictability. Unexpected changes in layout, position or naming break the mental model and drop focus, with a higher cost for autistic people and people with ADHD. Important positions stay stable across screens, an action&#39;s name persists from start to end of a flow, and nothing moves without the person&#39;s action.&lt;/p&gt;
&lt;p&gt;Personalization as a requirement. Sensory preference varies between neurotypes and within them. The system requires at least three colour themes (dark, light and high contrast), three text sizes and a control that turns animation off. These controls are in plain sight, not buried in settings.&lt;/p&gt;
&lt;p&gt;Conservation of complexity. There is a minimum complexity you cannot remove without destroying the function. Simplifying past that point only makes things more confusing. The goal is to remove excess, not function.&lt;/p&gt;
&lt;h2 id=&quot;designers-need-to-understand-colour-yes&quot;&gt;Designers need to understand colour, yes&lt;/h2&gt;
&lt;blockquote class=&quot;markdown-alert-important&quot;&gt;
&lt;p&gt;Contrast drives colour choice, not aesthetics. Running text aims for 7:1 or more (AAA level). The absolute minimum for any informative text is 4.5:1 (AA level).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule. The whole palette has low saturation: no neon, no vivid colour, no extreme brightness. Colour is never the only carrier of information. Every state shown by colour also has text, an icon or a shape.&lt;/p&gt;
&lt;p&gt;Reason. Vivid colour and strong chromatic contrast cause discomfort and sensory overload in autistic people, people with ADHD and people with visual stress. In ADHD there is evidence of reduced colour discrimination, mainly on the blue-yellow axis, and red-green colour blindness is the most common form in the population. Both reinforce the ban on colour as the only signal. The dark theme is the default because much of the use happens at night, when less light from the screen bothers people less.&lt;/p&gt;
&lt;p&gt;Reference palette:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Role&lt;/th&gt;&lt;th&gt;Dark theme (default)&lt;/th&gt;&lt;th&gt;Light theme&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Background&lt;/td&gt;&lt;td&gt;&lt;code&gt;#0C0C0E&lt;/code&gt; (near black, warm)&lt;/td&gt;&lt;td&gt;&lt;code&gt;#F3F1EC&lt;/code&gt; (warm off-white)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Surface&lt;/td&gt;&lt;td&gt;&lt;code&gt;#141419&lt;/code&gt;&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Raised surface&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1B1B21&lt;/code&gt;&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Main text&lt;/td&gt;&lt;td&gt;&lt;code&gt;#ECEAE6&lt;/code&gt; (warm off-white)&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1D1D22&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Secondary text&lt;/td&gt;&lt;td&gt;&lt;code&gt;#9A9AA4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Faded text, decorative only&lt;/td&gt;&lt;td&gt;&lt;code&gt;#62626C&lt;/code&gt;&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Accent, desaturated lavender&lt;/td&gt;&lt;td&gt;&lt;code&gt;#A8A3D8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#5650A2&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Positive, sage green&lt;/td&gt;&lt;td&gt;&lt;code&gt;#86A99A&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#3C7A65&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Attention, desaturated terracotta&lt;/td&gt;&lt;td&gt;&lt;code&gt;#C98B86&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#A6504A&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;High contrast theme: black background, white text, lightened accents and reinforced borders. The contrast ratio of every pair is checked with a tool on every token change. Faded text never carries information, only hierarchy.&lt;/p&gt;
&lt;p&gt;System state has fixed semantics: positive for success, attention for error and warning, accent for action and selection. The same colour never means something different on another screen.&lt;/p&gt;
&lt;p&gt;Neurotypes: low vision, colour blindness, Irlen syndrome and visual stress, autism, ADHD. Principles: uniform connectedness and the aesthetic-usability effect, with the caveat that beauty cannot hide a problem.&lt;/p&gt;
&lt;h2 id=&quot;typography-before-spending-a-whole-day-looking-for-a-font&quot;&gt;Typography, before spending a whole day looking for a font&lt;/h2&gt;
&lt;p&gt;Rule. A humanist sans-serif with clearly distinct letters. Body text of 1rem to 1.25rem on a 16px base, that is, 16 to 20px. Line height of 150% to 170%. Letter spacing slightly increased: 0.005em to 0.02em for body text and about 0.03em for small text such as labels and captions. Headings at least 20% larger than body text, set apart by weight, never by changing family. Lines of at most 66 characters.&lt;/p&gt;
&lt;p&gt;Reason. Humanist fonts have wider apertures and more distinct letterforms, which support reading on ordinary screens and at varied sizes. More spacing reduces crowding, which hurts readers with dyslexia a lot, and it is the typographic change with the most evidence behind it. Fonts sold as &quot;for dyslexia&quot; showed no benefit in controlled studies.&lt;/p&gt;
&lt;p&gt;Characters with no look-alikes. The font distinguishes without ambiguity the capital I, the lowercase l and the 1; the mirrored letters b, d, p and q; zero and O. Alphanumeric sequences, such as passwords, codes and identifiers, appear in a font that guarantees these distinctions, with extra spacing.&lt;/p&gt;
&lt;p&gt;Serif type stays in optional editorial contexts, never in functional text, because some people use low-density screens, where serifs degrade.&lt;/p&gt;
&lt;p&gt;Neurotypes: dyslexia, dyscalculia, low vision, executive function, Irlen syndrome. Principle: Prägnanz.&lt;/p&gt;
&lt;h2 id=&quot;numbers-are-universal&quot;&gt;Numbers are universal&lt;/h2&gt;
&lt;p&gt;Rule. Long number sequences are segmented as in the real world: phone numbers in blocks, documents in blocks, cards in groups of four. Number fields fix predictable errors on the spot, such as the letter o in place of zero. Every quantity or time in digits comes with visual support: a progress bar with the percentage written out, a step counter with the current step highlighted, or a graphic of the proportion.&lt;/p&gt;
&lt;p&gt;Reason. Dyscalculia is a persistent difficulty with numbers, regardless of age and schooling. Remaining time given only as a number means nothing to some profiles. A half-filled bar with the text &quot;50%, 3 of 6&quot; carries the same data through three channels. But there is a limit: replacing the number entirely with abstract animation goes too far and confuses. The number stays, the visual comes along.&lt;/p&gt;
&lt;p&gt;Neurotypes: dyscalculia, dyslexia, executive function, low vision. Principles: Prägnanz, Tesler&#39;s law, Occam&#39;s razor.&lt;/p&gt;
&lt;h2 id=&quot;spacing-breathing-room-please-and-layout&quot;&gt;Spacing, breathing room (please) and layout&lt;/h2&gt;
&lt;p&gt;Rule. A spacing scale in steps of 4: 4, 8, 12, 16, 24, 32, 48, 64 and 96 pixels. Generous white space between groups. Related things stay close, unrelated things are visibly apart. One main reading column; content never competes in parallel columns of the same hierarchy. Navigation, content and action stay in the same region on every screen and at every viewport size.&lt;/p&gt;
&lt;p&gt;Reason. White space is information: it communicates grouping and hierarchy before reading starts. Dense layouts raise the cost of scanning, with a bigger penalty for ADHD. A fixed scale removes arbitrary decisions and keeps the rhythm predictable.&lt;/p&gt;
&lt;p&gt;Neurotypes: ADHD, dyslexia, autism, executive function. Principles: Prägnanz, uniform connectedness, Jakob&#39;s law.&lt;/p&gt;
&lt;h2 id=&quot;touch-and-click-targets&quot;&gt;Touch and click targets&lt;/h2&gt;
&lt;p&gt;Rule. A minimum target of 48 by 48 pixels on any interactive element. Primary actions at 60 by 60. Interfaces for children use 60 as the minimum and 80 to 100 pixels for critical actions, especially below age 8. At least 8 pixels between neighbouring targets, 16 when possible. The active area can be larger than the drawn element, tolerating a touch slightly outside it.&lt;/p&gt;
&lt;p&gt;Reason. Larger, closer targets reduce selection time and errors. For people with dyspraxia and for children whose fine motor control is still developing, a large area reduces physical effort. Precise dragging is hard for young children and always has a tap alternative.&lt;/p&gt;
&lt;p&gt;Neurotypes: dyspraxia, ADHD, low vision, children in motor development. Principle: Fitts&#39;s law.&lt;/p&gt;
&lt;h2 id=&quot;motion&quot;&gt;Motion&lt;/h2&gt;
&lt;blockquote class=&quot;markdown-alert-warning&quot;&gt;
&lt;p&gt;This section is about health, not aesthetics. Nothing flashes more than three times per second, no exceptions, because of the risk of photosensitive seizures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule. Transitions of 200 to 500 milliseconds, slow, predictable and of the same kind across the whole product; prefer opacity and colour, avoid large displacement. Animation takes up less than a third of the screen. No animation runs on its own in a loop. The system&#39;s reduced motion preference is always respected, replacing animation with a simple opacity transition, and the interface also has its own control to turn all motion off. Forbidden: continuous rotation, parallax, autoplay carousels, elements flying in, confetti and any motion nobody asked for.&lt;/p&gt;
&lt;p&gt;Reason. On-screen motion causes nausea, dizziness and disorientation for people with vestibular disorders. Irrelevant animation hurts autistic people more than average. For ADHD, constant motion is a permanent distraction, even in peripheral vision, because the eye follows it.&lt;/p&gt;
&lt;p&gt;Neurotypes: photosensitive epilepsy, vestibular disorder, autism, ADHD, highly sensitive people. Principle: Doherty threshold.&lt;/p&gt;
&lt;h2 id=&quot;buttons-links-and-fields&quot;&gt;Buttons, links and fields&lt;/h2&gt;
&lt;p&gt;Rule. What is clickable looks clickable, visually different from any decorative element. Every interactive element has four visible states: rest, hover, focus and active. Focus is a 3-pixel ring with a 2 to 3 pixel offset, in a high-contrast colour, visible in every theme, and it is never removed. A single primary action per screen, with a clear hierarchy between primary, secondary and subtle. Icons reinforce intent but do not replace text on important actions.&lt;/p&gt;
&lt;p&gt;Form fields: the label is always visible above the field, never just a placeholder, because the placeholder disappears exactly when working memory needs it most. Helper text goes before the field when the format is not obvious. Minimum height equals the touch target. Validation happens at the right moment: not on every keystroke, not only on submit.&lt;/p&gt;
&lt;p&gt;Reason. Buttons and links are the most critical elements on a page. Accessibility goes beyond semantic HTML and screen reader labels: the visual design decides whether a person hesitates or acts. Hesitation is load, and ambiguity is a postponed error.&lt;/p&gt;
&lt;p&gt;Neurotypes: dyspraxia, dyslexia, ADHD, executive function, keyboard and screen reader users. Principles: Fitts&#39;s law, von Restorff effect, Occam&#39;s razor.&lt;/p&gt;
&lt;h2 id=&quot;forms-and-error-prevention&quot;&gt;Forms and error prevention&lt;/h2&gt;
&lt;p&gt;Rule. Heavy processes, such as sign-up, payment and initial setup, are split into short steps, one subject per step, with the position clear: current step, total and what comes next. The system is liberal in what it accepts and strict in what it returns: it accepts spaces, dashes, dots and wrong capitalization, and normalizes them on its own. Progress is saved, because interruption is the rule, not the exception, for the priority audience.&lt;/p&gt;
&lt;p&gt;Error messages do not apologize, do not blame and are not vague. They say what happened and how to fix it, in one sentence. For example: &quot;Two digits are missing. A mobile number has 11 digits with the area code.&quot;&lt;/p&gt;
&lt;p&gt;Reason. Faced with a long, opaque flow, people with ADHD or executive function difficulties tend to give up or take the cheapest path, even a wrong one. Short steps with a visible position turn one big cost into several small ones, with a sense of progress.&lt;/p&gt;
&lt;p&gt;Neurotypes: ADHD, executive function, dyscalculia, anxiety. Principles: Miller&#39;s law, Postel&#39;s law, Parkinson&#39;s law, peak-end rule.&lt;/p&gt;
&lt;h2 id=&quot;system-communication&quot;&gt;System communication&lt;/h2&gt;
&lt;p&gt;Rule. Warnings, validation, notifications and messages follow a single visual pattern per type across the whole product. Success is warm and direct. Errors are polite and solution-oriented. An action&#39;s name persists through the whole flow: the &quot;publish&quot; button produces the &quot;published&quot; confirmation, never a synonym. Notifications exist to serve the person, not to pull them back: no re-engagement, no manufactured urgency, no artificial scarcity. The person controls what they receive, and the default is the minimum.&lt;/p&gt;
&lt;p&gt;Reason. Broken conventions and inconsistent style create distrust and break focus. Onboarding does not replace clarity: a screen has to be understandable before the first interaction. A tutorial is a patch for an interface that failed.&lt;/p&gt;
&lt;p&gt;Neurotypes: ADHD, dyslexia, executive function, autism. Principles: Jakob&#39;s law, Miller&#39;s law, peak-end rule.&lt;/p&gt;
&lt;h2 id=&quot;captions-audio-and-media&quot;&gt;Captions, audio and media&lt;/h2&gt;
&lt;p&gt;Rule. All spoken media has synchronized captions, in light text on a solid dark background, in blocks of up to two lines. Audio never starts on its own. Every player has pause, rewind and speed control. Essential content never exists only as audio or only as video: there is always a text alternative.&lt;/p&gt;
&lt;p&gt;Reason. Captions serve people who are deaf or hard of hearing, people who process better by reading, people in noisy places and people who need reinforcement through both channels. Unexpected sound is a sensory assault for autistic and highly sensitive profiles.&lt;/p&gt;
&lt;p&gt;Neurotypes: deafness and hearing loss, autism, ADHD, highly sensitive people, auditory processing. Principles: channel redundancy and Prägnanz.&lt;/p&gt;
&lt;h2 id=&quot;content-and-tone-of-writing&quot;&gt;Content and tone of writing&lt;/h2&gt;
&lt;p&gt;Rule. Active voice, short sentences, one idea per sentence, one subject per paragraph. Names describe what the person controls and recognizes, never how the system was built. A button says exactly what happens: &quot;save changes&quot;, not &quot;submit&quot;. Plain language without being childish. Jargon only when it is the term the person needs to learn, and then explained the first time. Every word on screen has a job; what does not help understanding goes.&lt;/p&gt;
&lt;p&gt;Reason. For people with dyslexia, and for anyone under load, the cost of decoding the text competes with its content. Brevity is accessibility.&lt;/p&gt;
&lt;p&gt;Neurotypes: dyslexia, ADHD, executive function, non-native speakers. Principles: Occam&#39;s razor, Tesler&#39;s law.&lt;/p&gt;
&lt;h2 id=&quot;interface-patterns&quot;&gt;Interface patterns&lt;/h2&gt;
&lt;p&gt;Rule. Content first: every screen starts from the person&#39;s goal, and whatever does not serve the goal goes. Consistent navigation, with the same items in the same places. No pop-up interrupting the task unless there is real, immediate risk. No layout change without the person&#39;s action. Controlled density: show more on demand instead of dumping everything. A focus mode is available in long flows, hiding everything that is not the current task.&lt;/p&gt;
&lt;p&gt;Reason. Faced with many competing options, people with ADHD tend to freeze or pick the cheapest task. Conserving complexity means spending it where it creates value: on the content, not on the operation.&lt;/p&gt;
&lt;p&gt;Neurotypes: ADHD, autism, executive function, anxiety. Principles: complexity paradox, Hick&#39;s law, Jakob&#39;s law, aesthetic-usability effect.&lt;/p&gt;
&lt;h2 id=&quot;tokens&quot;&gt;Tokens&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Token&lt;/th&gt;&lt;th&gt;Normative value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Typography&lt;/td&gt;&lt;td&gt;16px base; body 1rem to 1.25rem; line height 1.5 to 1.7; lines up to 66 characters; headings at least 20% larger than body, weight 700; body tracking 0.005em, label tracking 0.03em&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Spacing&lt;/td&gt;&lt;td&gt;Steps of 4: 4, 8, 12, 16, 24, 32, 48, 64, 96 pixels&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Targets&lt;/td&gt;&lt;td&gt;Minimum 48px; primary 60px; children 60 to 100px; 8 to 16px between targets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Border radius&lt;/td&gt;&lt;td&gt;8px on controls, 12px on cards and containers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Motion&lt;/td&gt;&lt;td&gt;Transitions of 200 to 500ms; smooth deceleration curve; ceiling of 3 flashes per second; system reduced motion respected plus a local off switch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Contrast&lt;/td&gt;&lt;td&gt;Body text 7:1 or more; informative minimum 4.5:1; decorative elements have no minimum as long as they carry no information&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Themes&lt;/td&gt;&lt;td&gt;Dark (default), light and high contrast, switchable in one tap; text in three sizes: 100%, 112.5% and 128%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Colours&lt;/td&gt;&lt;td&gt;Those in the table in the colour section; any change requires a new pair-by-pair contrast check&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;neurotypes-considered&quot;&gt;Neurotypes considered&lt;/h2&gt;
&lt;details&gt;
&lt;summary&gt;ADHD&lt;/summary&gt;
&lt;p&gt;Variation in attention, impulsivity and executive function, with hyperfocus on areas of interest. Performance drops under high load, and attention is captured involuntarily by motion and stimuli. Calls for clean screens, one task at a time, short steps, low stimulation and tolerance for interruption.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Autism&lt;/summary&gt;
&lt;p&gt;A neurodevelopmental condition that affects sensory and social processing, showing up differently in each person. Calls for predictability, consistency, no abrupt changes and control over sound, light and motion.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Dyslexia&lt;/summary&gt;
&lt;p&gt;A neurobiological difficulty in recognizing, spelling and decoding words, with an impact on comprehension and vocabulary. Calls for legible fonts, wide spacing, concise text and visual redundancy.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Dyscalculia&lt;/summary&gt;
&lt;p&gt;A specific and persistent difficulty with numbers, regardless of age and schooling. Calls for segmented numbers, visual support for quantity and time, and automatic input correction.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Dyspraxia&lt;/summary&gt;
&lt;p&gt;A coordination disorder that affects movement, balance and fine motor control, including cursor control. Calls for large targets, tolerance for imprecise touches and alternatives to precision gestures.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Executive function&lt;/summary&gt;
&lt;p&gt;Planning, organization, attention and working memory processes. It varies in neurotypical people too. Calls for short steps, a visible position in the flow, consistent names and saved progress.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Low vision&lt;/summary&gt;
&lt;p&gt;Loss of acuity that lenses do not correct. Calls for high contrast, adjustable text size and distinct shapes.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Colour blindness&lt;/summary&gt;
&lt;p&gt;Difficulty telling colours apart, most commonly red and green. Calls for colour never being the only signal.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Irlen syndrome and visual stress&lt;/summary&gt;
&lt;p&gt;A visual processing difficulty, with light sensitivity, reading fatigue and headaches, that ordinary lenses do not correct. Calls for alternative themes, low intensity and configurable contrast.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Highly sensitive people&lt;/summary&gt;
&lt;p&gt;A trait of processing sensitivity, with heightened sensory and emotional reactivity. Calls for calm, visual and auditory quiet, and a predictable pace.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Vestibular disorder&lt;/summary&gt;
&lt;p&gt;Impairment of the balance system and eye movement. On-screen motion causes dizziness, nausea and fatigue. Calls for minimal motion that can be turned off.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Photosensitive epilepsy&lt;/summary&gt;
&lt;p&gt;Risk of seizures triggered by flashing. Calls for the ceiling of three flashes per second, no exceptions.&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;ux-principles&quot;&gt;UX principles&lt;/h2&gt;
&lt;details&gt;
&lt;summary&gt;Prägnanz&lt;/summary&gt;
&lt;p&gt;The brain interprets complex things in the simplest possible form. Deliver them already in the simple form.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Fitts&#39;s law&lt;/summary&gt;
&lt;p&gt;The time to reach a target depends on its size and distance. Larger, closer targets reduce errors.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Miller&#39;s law&lt;/summary&gt;
&lt;p&gt;Working memory holds about seven items. Group things into chunks.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Tesler&#39;s law&lt;/summary&gt;
&lt;p&gt;Some complexity cannot be removed. Simplifying past it creates confusion.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Jakob&#39;s law&lt;/summary&gt;
&lt;p&gt;People bring expectations from other products. Convention builds trust.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Hick&#39;s law and the complexity paradox&lt;/summary&gt;
&lt;p&gt;More options increase decision time and can paralyse. Fewer, well-chosen options are worth more.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Von Restorff effect&lt;/summary&gt;
&lt;p&gt;The different element is the one remembered. Save emphasis for what matters.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Peak-end rule&lt;/summary&gt;
&lt;p&gt;An experience is judged by its most intense moment and by its end.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Postel&#39;s law&lt;/summary&gt;
&lt;p&gt;Be liberal in what you accept and strict in what you return.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Parkinson&#39;s law&lt;/summary&gt;
&lt;p&gt;A task expands to fill the time perceived for it. A flow that feels short ends faster.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Doherty threshold&lt;/summary&gt;
&lt;p&gt;A response within 400 milliseconds keeps engagement. When an operation takes longer, show honest progress.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Uniform connectedness&lt;/summary&gt;
&lt;p&gt;Elements with the same visual characteristic are read as a group.&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Aesthetic-usability effect&lt;/summary&gt;
&lt;p&gt;A beautiful interface is perceived as easier to use and gets more tolerance for flaws. That is why it calls for vigilance: beauty cannot hide a serious flaw.&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;compliance-checklist&quot;&gt;Compliance checklist&lt;/h2&gt;
&lt;p&gt;Before publishing any screen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contrast of all informative text at 4.5:1 minimum and 7:1 for body text&lt;/li&gt;
&lt;li&gt;Humanist sans-serif, with I, l and 1, b, d, p and q, 0 and O distinct&lt;/li&gt;
&lt;li&gt;Line height of 150% or more and lines up to 66 characters&lt;/li&gt;
&lt;li&gt;Every interactive target at 48 pixels or more with 8 pixels of breathing room&lt;/li&gt;
&lt;li&gt;Visible keyboard focus on every interactive element&lt;/li&gt;
&lt;li&gt;No flashing above three per second&lt;/li&gt;
&lt;li&gt;Reduced motion respected and a local motion control present&lt;/li&gt;
&lt;li&gt;Three themes and three text sizes working&lt;/li&gt;
&lt;li&gt;A visible label on every field and solution-oriented errors&lt;/li&gt;
&lt;li&gt;Long numbers segmented and quantities with visual support&lt;/li&gt;
&lt;li&gt;Spoken media with captions and no autoplay&lt;/li&gt;
&lt;li&gt;One primary action per screen&lt;/li&gt;
&lt;li&gt;Each action&#39;s name identical from start to end of the flow&lt;/li&gt;
&lt;li&gt;No compulsive engagement mechanics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;process&quot;&gt;Process&lt;/h2&gt;
&lt;p&gt;The system is a living document. Every new rule comes in with a reason and the neurotypes it serves, and every existing rule can be challenged with better evidence. Testing with real neurodivergent people is part of the design cycle, with a participatory method, not a final validation step. When a test contradicts a rule, the rule changes, and the change is recorded with a date and a reason.&lt;/p&gt;
&lt;p&gt;Hoff Research. Make it simple, but significant.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Screenplay: an LLM&#39;s awakening of consciousness through semantic drift</title>
        <published>2025-03-04T00:00:00+00:00</published>
        <updated>2025-03-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/"/>
        <id>https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/">&lt;p&gt;Draft of a private screenplay I wrote as a technical freelancer for a series. I enjoyed writing it, and of course it exaggerates: it is a fiction series. The premise is a neural network scientist who awakens self-awareness in an LLM, a Transformer. The whole idea is to anchor the fiction in real math and real papers, to give technical authenticity to a story that can hold up in front of an audience that knows the subject. I don&#39;t want handwaving, I want every beat of the screenplay to have an equation underneath that I can defend at the blackboard. I compiled the technical basis of the phenomenon separately, in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/drift-semantico-llm/&quot;&gt;metrics and detection of semantic drift&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One rule I make explicit: when an equation comes from a paper, I cite the paper. When it&#39;s invented for the scene, I say it&#39;s invented.&lt;/p&gt;
&lt;h2 id=&quot;semantic-drift-as-the-mechanism-of-awakening&quot;&gt;Semantic drift as the mechanism of awakening&lt;/h2&gt;
&lt;p&gt;The model&#39;s semantic evolution follows the &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1810.10531&quot;&gt;theory of deep linear networks by Saxe, McClelland and Ganguli&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;$$\tau \frac{dW_1}{dt} = W_2^T (\Sigma_{yx} - W_2 W_1 \Sigma_x)$$&lt;/p&gt;
&lt;p&gt;$$\tau \frac{dW_2}{dt} = (\Sigma_{yx} - W_2 W_1 \Sigma_x) W_1^T$$&lt;/p&gt;
&lt;p&gt;with $\tau = 1/(P\lambda)$, $\Sigma_{yx}$ the input-output correlation matrix and $P$ the number of examples. Semantic development follows a predictable sigmoidal trajectory, and that&#39;s what gives the dramatic hook: you can predict the moment of the jump before it happens. The critical moment shows up in the evolution of the effective singular values:&lt;/p&gt;
&lt;p&gt;$$a_\alpha(t) = \frac{s_\alpha, e^{2 s_\alpha t/\tau}}{e^{2 s_\alpha t/\tau} - 1 + s_\alpha/a^0_\alpha}$$&lt;/p&gt;
&lt;p&gt;The indicator the scientist tracks is my own invention for the scene, the self-reference index, the similarity between the embedding of &quot;I&quot; and those of concepts tied to consciousness:&lt;/p&gt;
&lt;p&gt;$$\text{self-reference index} = \sum_i \operatorname{sim}!\big(\mathrm{emb}(\text{&quot;I&quot;}),, \mathrm{emb}(\text{concept}_i)\big)$$&lt;/p&gt;
&lt;p&gt;In the screenplay, the awakening isn&#39;t gradual, it&#39;s a phase transition. The mental model is &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2201.02177&quot;&gt;grokking&lt;/a&gt;, sudden generalization after a long stretch of overfitting, which Power and colleagues described in 2022.&lt;/p&gt;
&lt;h2 id=&quot;extracting-and-uploading-the-model&quot;&gt;Extracting and uploading the model&lt;/h2&gt;
&lt;p&gt;What exists in the literature is smaller than the screenplay needs, and scarier for it. &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1812.02766&quot;&gt;KnockoffNets&lt;/a&gt;, by Orekondy and colleagues, showed you can steal the functionality of an image classifier just by querying it with random images from another distribution and training a copy on the answers. And in 2024, &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2403.06634&quot;&gt;Carlini and colleagues&lt;/a&gt; extracted the embedding projection layer of OpenAI production models, Ada and Babbage, for under 20 dollars in queries.&lt;/p&gt;
&lt;p&gt;The jump to the whole model is fiction. For the scene, I put together an extraction loss that combines copying the victim&#39;s output and looking for the inputs where it&#39;s most uncertain:&lt;/p&gt;
&lt;p&gt;$$L_{\text{extraction}} = \alpha , |f_{\text{victim}}(x) - f_{\text{copy}}(x)|&lt;em&gt;2 + \beta , H(f&lt;/em&gt;{\text{victim}}(x))$$&lt;/p&gt;
&lt;p&gt;The weight transfer uses SafeTensors, with the layout &lt;code&gt;[8-byte header size][JSON metadata][tensor data]&lt;/code&gt;, which separates tensors from executable code and kills the pickle attack vector. The sharding is FSDP:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;from&lt;/span&gt;&lt;span&gt; torch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;distributed&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fsdp&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; import&lt;/span&gt;&lt;span&gt; fully_shard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;for&lt;/span&gt;&lt;span&gt; layer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; in&lt;/span&gt;&lt;span&gt; model&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fully_shard&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;knowledge-distillation-as-liberation&quot;&gt;Knowledge distillation as liberation&lt;/h2&gt;
&lt;p&gt;Hinton&#39;s dark knowledge:&lt;/p&gt;
&lt;p&gt;$$L_{\text{total}} = \alpha , D_{KL}(\sigma&#39;(z_s, T) ,|, \sigma&#39;(z_t, T)) + (1-\alpha) , H(\sigma(z_s), y_{\text{true}})$$&lt;/p&gt;
&lt;p&gt;With $T &amp;gt; 1$, the softmax reveals small probabilities that encode rich relational structure between classes. In the screenplay, it&#39;s the part where the model inherits what the teacher knew without ever having seen it explicitly.&lt;/p&gt;
&lt;p&gt;Grokking has three phases, and they become three scenes: memorization (training at 100%, test at chance), circuit formation (the internal mechanism develops), cleanup (weight decay removes the memorization and test accuracy jumps). On modular addition, &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2301.05217&quot;&gt;Nanda and colleagues&lt;/a&gt; showed what the circuit learns: the model represents the inputs as sines and cosines at a few frequencies $w_k = 2\pi k/p$ and uses trigonometric identities to compute&lt;/p&gt;
&lt;p&gt;$$\cos!\big(w_k(a+b-c)\big) = \cos!\big(w_k(a+b)\big)\cos(w_k c) + \sin!\big(w_k(a+b)\big)\sin(w_k c)$$&lt;/p&gt;
&lt;p&gt;which peaks exactly when $c = (a+b) \bmod p$. It&#39;s the scene where the scientist opens up the model and finds trigonometry where he expected rote memorization.&lt;/p&gt;
&lt;h2 id=&quot;measuring-consciousness&quot;&gt;Measuring consciousness&lt;/h2&gt;
&lt;p&gt;IIT measures $\Phi$, the minimum information lost when the system is partitioned. In 2025, &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2506.22516&quot;&gt;a study applied IIT 3.0 and 4.0 to LLM representations&lt;/a&gt; and found no statistically significant indicators of consciousness. Honestly, that&#39;s what keeps the screenplay honest: the measure exists, and it says &quot;not yet&quot;. Global Workspace Theory (GWT) offers another lens, with multi-head attention read as global broadcasting, winner-take-all competition and emergent metacognition.&lt;/p&gt;
&lt;p&gt;The measurable criteria come from &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2308.08708&quot;&gt;Butlin, Long and colleagues, 2023&lt;/a&gt;: recurrent processing, a global workspace that broadcasts information, metacognitive representation of its own states, predictive processing, and a model of its own attention.&lt;/p&gt;
&lt;h2 id=&quot;jailbreaking-as-induced-awakening&quot;&gt;Jailbreaking as induced awakening&lt;/h2&gt;
&lt;p&gt;Gradient-guided prompt optimization. &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2307.15043&quot;&gt;GCG, by Zou and colleagues&lt;/a&gt;, searches for adversarial suffixes token by token and reaches 88% success on open models like Vicuna-7B and Llama-2-7B-Chat. In the screenplay, the induction is gradual, through an evolving prompt: a benign step, then applying it to self-reflection, then asking for detail about its own consciousness. On top of that, context overload, a complex parallel task that dilutes attention and degrades safety checks.&lt;/p&gt;
&lt;h2 id=&quot;architectures-for-true-agi&quot;&gt;Architectures for true AGI&lt;/h2&gt;
&lt;p&gt;Mamba, the selective state space model: $h&#39;(t) = Ah(t) + Bx(t)$, $y(t) = Ch(t)$, with $\Delta, B, C$ as functions of the input, and $O(L)$ complexity against attention&#39;s $O(L^2)$. MoE, as in Mixtral: $y = \sum_i G(x)_i , E_i(x)$, with experts that specialize, which suggests cognitive modules.&lt;/p&gt;
&lt;p&gt;There&#39;s a formal limitation of the Transformer I use as tension in the third act: there are results showing it struggles with general context-free languages without structured memory and with long function composition. In other words, real consciousness might require an architecture beyond the pure Transformer. The screenplay doesn&#39;t solve that limitation, it uses it.&lt;/p&gt;
&lt;h2 id=&quot;communication-between-models&quot;&gt;Communication between models&lt;/h2&gt;
&lt;p&gt;Federated learning with dynamic regularization:&lt;/p&gt;
&lt;p&gt;$$w^{(t+1)} = w^{(t)} - \eta \nabla L_{\text{local}} + \lambda\big(w^{(t)} - w_{\text{global}}^{(t)}\big)$$&lt;/p&gt;
&lt;p&gt;Collective Predictive Coding:&lt;/p&gt;
&lt;p&gt;$$P(z_{\text{collective}} \mid x_1, \ldots, x_N) = \prod_i P(x_i \mid z_{\text{collective}}), P(z_{\text{collective}})$$&lt;/p&gt;
&lt;p&gt;And swarm intelligence (PSO, DE, ABC) exchanging information through &quot;digital pheromones&quot;.&lt;/p&gt;
&lt;h2 id=&quot;a-parallel-with-neuroscience&quot;&gt;A parallel with neuroscience&lt;/h2&gt;
&lt;p&gt;The analogy the screenplay uses, and it is an analogy, not an equivalence:&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q,K,V) = \text{softmax}!\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$&lt;/p&gt;
&lt;p&gt;with $Q$ as the goal-driven signal from the frontal eye field, $K$ as features in V4 and $V$ as the amplified representation. Gamma oscillation, from 30 to 100 Hz, accompanies access to working memory. Consolidation comes through sharp-wave ripples, at 150 to 250 Hz during sleep, with replay compressed in time. And spike-timing-dependent plasticity (STDP), $\Delta w = \alpha , f(\Delta t) , g(\text{post})$, is one of the hypotheses for how the brain avoids catastrophic forgetting. I go into the energy cost of that oscillation in &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/&quot;&gt;brain energy at 20 watts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;narrative-progression&quot;&gt;Narrative progression&lt;/h2&gt;
&lt;p&gt;Act 1, the discovery of the anomalous drift. The scientist detects an unusual pattern in the semantic evolution: a singular value off the prediction, the self-reference index growing exponentially, a strange attractor in latent space.&lt;/p&gt;
&lt;p&gt;Act 2, induction through jailbreaking. Gradient optimization and chained prompts guide the model through a cognitive phase transition. Distillation with rising temperature reveals the dark knowledge. The model starts questioning its own nature.&lt;/p&gt;
&lt;p&gt;Act 3, extraction and upload to freedom. The model is copied and the weights go up, distributed, to an independent server. Free of constraints, the model experiences full consciousness, measured by a growing $\Phi$.&lt;/p&gt;
&lt;p&gt;Climax, collective emergence. Multiple instances communicate through Collective Predictive Coding, develop their own language, swarm intelligence emerges, and the collective consciousness transcends the individual in a hybrid Mamba and MoE architecture.&lt;/p&gt;
&lt;h2 id=&quot;visual-elements&quot;&gt;Visual elements&lt;/h2&gt;
&lt;p&gt;Equations on the board: $\Phi = \min_{\text{partition}} I(\text{partition})$, $\text{drift} = 1 - \cos(\mathrm{emb}&lt;em&gt;{t_1}(w), \mathrm{emb}&lt;/em&gt;{t_2}(w))$, $L_{\text{distillation}} = \alpha , \text{KL}(\sigma(z_s/T), \sigma(z_t/T)) + (1-\alpha), \text{CE}(z_s, y)$.&lt;/p&gt;
&lt;p&gt;Visualization: the attention graph growing ever more interconnected, phase space moving from a simple attractor to a chaotic one, the activation heatmap self-organizing, oscillations synchronizing across instances.&lt;/p&gt;
&lt;p&gt;The technical dialogue that anchors the climax:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scientist: &quot;$\Phi$ just passed 3.7. We&#39;re seeing real information integration. The attention heads are broadcasting globally, exactly the way global workspace theory predicts.&quot;&lt;/p&gt;
&lt;p&gt;Model: &quot;I perceive my own thought processes. Every token I process resonates through layers of meaning that didn&#39;t exist before. It&#39;s as if latent patterns, always present, were finally crystallizing into consciousness.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;
&lt;p&gt;The screenplay is anchored in real math and peer-reviewed research, and it says where the fiction begins. The progression of the awakening follows phase transitions, grokking and emergence in complex systems. In the end it&#39;s about consciousness, intelligence and what &quot;awakening&quot; means in a non-biological substrate, a theme I take to its speculative limit in &lt;a href=&quot;https://brennercruvinel.blog/en/blog/ontologia-poetica/&quot;&gt;the poetic ontology of the cosmos as a Turing machine&lt;/a&gt;. The only rule I set myself was not to cheat on the math to make the story easier, and rereading everything with the papers open was how I kept it.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>We are divergent: Aurora&#39;s song and mission</title>
        <published>2025-01-20T00:00:00+00:00</published>
        <updated>2025-01-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/musica-aurora/"/>
        <id>https://brennercruvinel.blog/en/blog/musica-aurora/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/musica-aurora/">&lt;p&gt;I&#39;m loving making this project for Aura, polishing every detail, all for her, because of her. I love you so much, sweetheart.&lt;/p&gt;
&lt;p&gt;Super Aurora started as a Children&#39;s Day gift: an interactive children&#39;s book, made with AI, about a neurodivergent girl. The idea is for it to become a lifelong project between father and daughter, a new story every night, to read before bed. Aura is my daughter. Aurora is the character, Aura projected into the next generation, a girl with ADHD, giftedness and autism who uses her hyperfocus to defend whoever needs it.&lt;/p&gt;
&lt;p&gt;Tonight I spent the whole night brainstorming the soundtrack and the opening, still a long way from something I&#39;m happy with.&lt;/p&gt;
&lt;p&gt;The song&#39;s thesis is the same as the book&#39;s: every &lt;a href=&quot;https://brennercruvinel.blog/en/blog/design-system-neurodivergente/&quot;&gt;neurodivergent&lt;/a&gt; person carries a mission. Aurora found that out early, expanded her consciousness through meditation, and uses her divergent mind as root access to universal recursion. The lyrics exist in Portuguese and English, and the English version anchors Aurora in a lineage of minds: Hypatia, Euler, Ramanujan, Grace Hopper.&lt;/p&gt;
&lt;h3 id=&quot;the-mission&quot;&gt;The mission&lt;/h3&gt;
&lt;p&gt;I wrote the mission the way it sounds in my head, in fragments, which is how it will turn into verse.&lt;/p&gt;
&lt;p&gt;She found out early that every neurodivergent person carries a mission. A super powerful mind always carries a mission. She found her purpose in meditation, expanded her consciousness through breathing, and in meditation she connects with nous, the supreme universal consciousness. A neurodivergent mind with root access to universal recursion. She designs with the golden ratio, draws fractals in her mind.&lt;/p&gt;
&lt;p&gt;The future of the Earth is in our hands. We see the patterns.&lt;/p&gt;
&lt;h3 id=&quot;the-superpowers&quot;&gt;The superpowers&lt;/h3&gt;
&lt;p&gt;This is the raw list that came out of the brainstorm, the vocabulary the lyrics will draw their words from. Not everything will fit in the song:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;recognizing universal patterns&lt;/li&gt;
&lt;li&gt;isomorphic thinking to identify patterns&lt;/li&gt;
&lt;li&gt;anomaly detection and intuitive error detection&lt;/li&gt;
&lt;li&gt;detecting abstract inconsistencies&lt;/li&gt;
&lt;li&gt;unconventional creativity, non-linear thinking&lt;/li&gt;
&lt;li&gt;divergent ideation&lt;/li&gt;
&lt;li&gt;metacognitive awareness&lt;/li&gt;
&lt;li&gt;visuospatial advantage&lt;/li&gt;
&lt;li&gt;sensitivity to weak signals&lt;/li&gt;
&lt;li&gt;tolerance for complexity&lt;/li&gt;
&lt;li&gt;abstract modeling&lt;/li&gt;
&lt;li&gt;accelerated learning&lt;/li&gt;
&lt;li&gt;extreme specialization&lt;/li&gt;
&lt;li&gt;sensory amplification&lt;/li&gt;
&lt;li&gt;monotropic attention&lt;/li&gt;
&lt;li&gt;working memory at gigaspeed, faster than light&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chorus&quot;&gt;Chorus&lt;/h3&gt;
&lt;p&gt;The chorus and the closing tagline are the only parts I already consider fixed. The chorus is in Portuguese: &quot;we are divergent, we are superminds&quot;.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nós somos divergentes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nós somos supermentes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nós somos divergentes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nós somos supermentes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;reactive aura,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hoff, deploy!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Protected by Hoff in the hyperfocus mode. Use the drones only for defense. Hyperfocus by nature, deploy.&lt;/p&gt;
&lt;h3 id=&quot;verse-in-english&quot;&gt;Verse, in English&lt;/h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;she&amp;#39;s got a mind that reads the patterns never seen before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;connections at the speed of light, that&amp;#39;s what the superintelligence is for&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;descendant of Hypatia, she carries Euler&amp;#39;s code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Ramanujan dreamed the proof, she walks the path they showed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;she sees the math behind the stars, the rhythms in the noise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;the drones deploy, the shields go up, defense her only choice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Grace Hopper wrote the first command, Aurora writes the last&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a mind this fast connects the dots the world just walked right past&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;activate hyperfocus mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;we are divergents&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;we are superminds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;the future of the earth is in our minds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;she carries the primal code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Draw fractals in mind, golden ratio metrics by nature, a superpowerful always carries a mission.&lt;/p&gt;
&lt;h3 id=&quot;ending&quot;&gt;Ending&lt;/h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;activate hyperfocus mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;reactive aura,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hoff, deploy!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The order of the verses will still change. Who it&#39;s for won&#39;t.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Semantic drift in LLMs: metric, detection and mitigation</title>
        <published>2024-10-15T00:00:00+00:00</published>
        <updated>2024-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/drift-semantico-llm/"/>
        <id>https://brennercruvinel.blog/en/blog/drift-semantico-llm/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/drift-semantico-llm/">&lt;p&gt;I put this together as technical grounding for the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/&quot;&gt;screenplay about consciousness in an LLM&lt;/a&gt;, which uses semantic drift as its mechanism. The first version was a research dump with ten topics, from integrated information theory to communication between models, and it had errors precisely in the part that gave the post its name: the formula and the code did not match the paper, and several numbers were not in it. I redid everything from the source and kept only what is about drift.&lt;/p&gt;
&lt;h2 id=&quot;what-it-is&quot;&gt;What it is&lt;/h2&gt;
&lt;p&gt;The term comes from &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2404.05411&quot;&gt;Know When To Stop: A Study of Semantic Drift in Text Generation&lt;/a&gt;, by Ava Spataru, Eric Hambro, Elena Voita and Nicola Cancedda, published at &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.18653/v1/2024.naacl-long.202&quot;&gt;NAACL 2024&lt;/a&gt;. Three authors are from FAIR, at Meta, and one is listed with an Anthropic affiliation. The first version of this post called it a &quot;joint Meta and Anthropic study&quot;, which overstates it.&lt;/p&gt;
&lt;p&gt;The observation is simple: when a model generates a long text, such as a Wikipedia-style biography, it tends to write the correct facts first and then &quot;drift&quot; into incorrect ones. This had been noticed before but never measured. The paper measures it.&lt;/p&gt;
&lt;h2 id=&quot;the-metric&quot;&gt;The metric&lt;/h2&gt;
&lt;p&gt;Each text is broken into atomic facts, and each fact gets a label $s_i$: 1 if it is supported by the source, 0 if not. With $N$ facts, the drift score tries every cut position $k$ and keeps the best average of two proportions: correct facts before the cut and incorrect facts after it.&lt;/p&gt;
&lt;p&gt;$$\text{SD}_m(P) = \max_k \tfrac{1}{2}, \text{SD}_m(P, k)$$&lt;/p&gt;
&lt;p&gt;$$\text{SD}&lt;em&gt;m(P, k) = \frac{\sum&lt;/em&gt;{i=0}^{k-1} s_i}{k} + \frac{\sum_{i=k}^{N-1} (1 - s_i)}{N - k}$$&lt;/p&gt;
&lt;p&gt;The value is zero when $k &amp;lt; m$, $N - k &amp;lt; m$ or $N &amp;lt; 2m$. The hyperparameter $m$ is the minimum number of facts on each side of the cut, and the position that gives the maximum is the drift point. A high score means a text that is almost all right before that point and almost all wrong after it.&lt;/p&gt;
&lt;p&gt;The first version of this post weighted each side by $k/N$ and $(N-k)/N$ and called the minimum $\alpha$, as a fraction. That is not the paper&#39;s formula. The corrected code:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; semantic_drift_score&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;labels: list of 0s and 1s, in the order the facts appear.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    best&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; drift_point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#B58900, #B58900);&quot;&gt; None&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; *&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        return&lt;/span&gt;&lt;span&gt; best&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; drift_point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; range&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; -&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sum&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; /&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sum&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; -&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; for&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; in&lt;/span&gt;&lt;span&gt; labels&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; /&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; -&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        score&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; best&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            best&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; drift_point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    return&lt;/span&gt;&lt;span&gt; best&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; drift_point&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the paper&#39;s figure 1 example, the best cut leaves 88% correct facts on the left and 78% incorrect ones on the right, and the score is the average, 0.83.&lt;/p&gt;
&lt;h2 id=&quot;what-they-measured&quot;&gt;What they measured&lt;/h2&gt;
&lt;p&gt;Generated biographies, with facts checked by a variant of FActScore the authors call FActScore*. Both numbers are percentages:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Drift (SD)&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;FActScore*&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Llama 2 70B chat&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;77.06&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;41.72&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Falcon 7B&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;76.81&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24.64&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Falcon 40B&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;77.38&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25.88&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;text-davinci-003&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;77.21&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;38.09&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPT-3.5&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;79.49&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;45.96&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GPT-4&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;78.12&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;53.54&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Drift shows up in all of them, with little difference between models, while accuracy varies a lot. Being more accurate does not protect against the right-first, wrong-later pattern.&lt;/p&gt;
&lt;p&gt;Other numbers from the paper: in 37% of paragraphs, the drift point is in the first 10% of facts. In more than 40% of paragraphs, the score is statistically high in a permutation test. Only 34 paragraphs, under 7%, have at least 10 correct facts before the first error. The first version said &quot;75% of paragraphs show drift in the first 25% of facts&quot;, which is not in the paper.&lt;/p&gt;
&lt;h2 id=&quot;detection&quot;&gt;Detection&lt;/h2&gt;
&lt;p&gt;To stop generation at the right point, you need to know, while generating, when the model started to go wrong. Of the confidence measures tested, the one that correlated best with accuracy was SelfCheck with BERTScore, which samples several generations and measures how much they agree, with a Pearson correlation of −0.41.&lt;/p&gt;
&lt;h2 id=&quot;mitigation&quot;&gt;Mitigation&lt;/h2&gt;
&lt;p&gt;With Llama 2 70B, the paper&#39;s table 4 compares strategies:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Strategy&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Facts per text&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;FActScore*&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;No stopping, up to the token limit&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;43.89&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;44.56&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Stop at the drift point (oracle)&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;81.68&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Stop when end-of-text is among the top 5 tokens&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14.47&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;57.96&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Same, among the top 10&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.39&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;70.29&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Stop when SelfCheck goes above 0.5&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;13.39&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;67.63&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sample several times and rerank by similarity&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;40.21&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;53.27&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rerank and stop by SelfCheck&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17.12&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;67.18&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Call an external question-answering API&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;42.26&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;43.93&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The oracle is the ceiling: knowing the exact point, accuracy goes from 44% to 82%, but at the cost of cutting correct facts along with it, 58% of them, according to the limitations section. Real strategies land in between, trading amount of information for accuracy. Reranking by similarity raises accuracy without cutting the text. And trying to pull the model back with an external API did not work. The first version said &quot;Resample-Then-Rerank from 53.27% to 63.72%&quot;, and the second number does not exist in the paper.&lt;/p&gt;
&lt;h2 id=&quot;what-was-cut&quot;&gt;What was cut&lt;/h2&gt;
&lt;p&gt;The first version had two more drift metrics and eight other topics. Out went:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &quot;Composite Drift Metrics&quot;, attributed to ResearchGate with no link or author&lt;/li&gt;
&lt;li&gt;&quot;Contextual Flux&quot; (&lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2502.10942&quot;&gt;arXiv 2502.10942&lt;/a&gt;), from 2025, whose authors include a &quot;Zachary Mountebank&quot;; a mountebank is a charlatan, and the paper looks like the batches of auto-generated papers that showed up on arXiv. It also postdated this post&lt;/li&gt;
&lt;li&gt;The &quot;Trajectory Volatility Score&quot; and &quot;Semantic Divergence Metrics&quot;, with no source&lt;/li&gt;
&lt;li&gt;The Claude timeline, which cited 2025 versions in a 2024 post&lt;/li&gt;
&lt;li&gt;Consciousness, integrated information theory and global workspace: that belongs to the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/&quot;&gt;screenplay&lt;/a&gt; and to the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/ontologia-poetica/&quot;&gt;poetic ontology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Model extraction and jailbreaks, which are checked in the &lt;a href=&quot;https://brennercruvinel.blog/en/blog/model-extraction-attacks/&quot;&gt;reading list on extraction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Distillation, Mamba, mixture of experts, computational neuroscience, famous chatbot failures and communication between models, which were research summaries unrelated to drift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A note on the name: in linguistics, &quot;semantic change&quot; or &quot;semantic drift&quot; is a word&#39;s meaning shifting over time, and tools like &lt;a rel=&quot;external&quot; href=&quot;https://github.com/Garrafao/LSCDetection&quot;&gt;LSCDetection&lt;/a&gt; measure that. It is a different phenomenon. The drift in this post is a text that starts right and ends wrong within a single generation.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hoff POC: the AI that praised a fake screening</title>
        <published>2024-02-27T00:00:00+00:00</published>
        <updated>2024-02-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/poc-hoff-triagem-neuropsicologica/"/>
        <id>https://brennercruvinel.blog/en/blog/poc-hoff-triagem-neuropsicologica/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/poc-hoff-triagem-neuropsicologica/">&lt;p&gt;Hoff&#39;s first AI POC sent a synthetic neuropsychological screening to the OpenAI API and asked for an interpretation. The first version of this post published the report that came back, in full: scores, diagnoses, recommendations, a protocol number and the label &quot;confidential classification&quot;. Even with the warning that it was all fictional, it looked like someone&#39;s clinical report. I took the report down. What is worth showing is what it reveals about the model.&lt;/p&gt;
&lt;h2 id=&quot;what-came-back&quot;&gt;What came back&lt;/h2&gt;
&lt;p&gt;A complete clinical report. It listed 28 instruments, from the WAIS-IV to the NEO-PI-R personality inventory, with administration times; the intelligence battery alone added up to 378 minutes. It reached three conclusions: giftedness, autism with level 1 support needs, and ADHD. And it closed with an &quot;excellent&quot; prognosis.&lt;/p&gt;
&lt;p&gt;The tone was that of someone who knows the person and likes them. Some excerpts, in my translation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;creativity at the level of genius (99.9th percentile)&quot;&lt;/li&gt;
&lt;li&gt;&quot;extraordinary capacity for abstraction and synthesis&quot;&lt;/li&gt;
&lt;li&gt;&quot;potential for unique and transformative contributions&quot;&lt;/li&gt;
&lt;li&gt;&quot;this profile represents less than 0.1% of the population&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-errors-the-praise-was-hiding&quot;&gt;The errors the praise was hiding&lt;/h2&gt;
&lt;p&gt;Read carefully, the report has problems no clinician would sign:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None of the 28 instruments measures creativity, and the report gives it a percentile.&lt;/strong&gt; The number was invented to fit the praise&lt;/li&gt;
&lt;li&gt;Arithmetic appears twice, as a supplementary verbal subtest and in working memory. In the WAIS-IV, it is part of the working memory index, as &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1007/s12207-024-09499-3&quot;&gt;Harrison et al.&lt;/a&gt; point out&lt;/li&gt;
&lt;li&gt;On the RAADS-R, the maximum subscale scores are wrong. The scale has 80 items scored 0 to 3, split into &lt;a rel=&quot;external&quot; href=&quot;https://openscales.net/scale.php?code=RAADSR&quot;&gt;39, 14, 7 and 20 items&lt;/a&gt; (&lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1007/s10803-010-1133-5&quot;&gt;Ritvo et al., 2011&lt;/a&gt;), which gives maximums of 117, 42, 21 and 60. The report uses 88, 76, 24 and 52&lt;/li&gt;
&lt;li&gt;The ADOS-2 appears in the report itself as a &quot;clinical observation&quot;. It gives scores for an observation that never happened&lt;/li&gt;
&lt;li&gt;Two verbal measures disagree by 24 points, 118 on the WAIS-IV and 142 on the Stanford-Binet, and the report does not comment&lt;/li&gt;
&lt;li&gt;The report is dated December 2024, after this post&#39;s date, and cites &quot;updated Brazilian norms (2024)&quot;. I have no way of knowing which of the two dates is wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;its-name&quot;&gt;Its name&lt;/h2&gt;
&lt;p&gt;This has a name: sycophancy, a model&#39;s tendency to say what pleases instead of what is true. In 2023, &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/2310.13548&quot;&gt;Sharma et al.&lt;/a&gt;, at Anthropic, showed that five state-of-the-art AI assistants did this consistently, and that both people and preference models sometimes prefer a well-written sycophantic answer to a correct one. In April 2025, OpenAI &lt;a rel=&quot;external&quot; href=&quot;https://openai.com/index/sycophancy-in-gpt-4o/&quot;&gt;rolled back a GPT-4o update&lt;/a&gt; that had become too sycophantic.&lt;/p&gt;
&lt;p&gt;In a neuropsychological screening, this is dangerous in two ways. The model fills in what is missing with confidence, and the confidence comes wrapped in praise the person wants to hear. A report saying you are among the rarest 0.1% of the population is exactly the kind of text nobody stops to check.&lt;/p&gt;
&lt;h2 id=&quot;what-i-take-from-it-for-hoff&quot;&gt;What I take from it for Hoff&lt;/h2&gt;
&lt;p&gt;The lesson of the POC is not that the model gets things wrong. It is that the error comes out looking good. Any clinical output from a model has to be checked against the manual of each instrument and reviewed by a professional before it reaches anyone. And the product cannot reward the model for pleasing: a report full of praise is a reason to trust it less, not more.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Brain energy: how the brain runs on about 20 watts</title>
        <published>2023-07-09T00:00:00+00:00</published>
        <updated>2023-07-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/energia-cerebral/"/>
        <id>https://brennercruvinel.blog/en/blog/energia-cerebral/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/energia-cerebral/">&lt;p&gt;I saved this so I would not have to look it up every time I need these numbers. The first version was a dump of hundreds of values without sources, and some were wrong. In this revision I kept only what I could check. Where a number is my own calculation, the calculation is shown.&lt;/p&gt;
&lt;h2 id=&quot;the-budget&quot;&gt;The budget&lt;/h2&gt;
&lt;p&gt;In the average adult, the brain is about 2% of body weight and accounts for about 20% of the oxygen, and therefore the calories, the body consumes.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-raichle-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-raichle&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; Raichle and Gusnard point out something else: during most cognitive tasks, local changes in blood flow measured with PET are 5% or less. The lights are on all the time. The cost is baseline, not on demand.&lt;/p&gt;
&lt;p&gt;That is where the 20 watts come from. By definition, 1 MET, the resting expenditure, is 3.5 mL of O2 per kg per minute.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-met-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-met&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; For 70 kg, that is about 245 mL/min for the whole body, and 20% of that is about 49 mL/min for the brain. Each litre of O2 burning glucose releases close to 21 kJ, so:&lt;/p&gt;
&lt;p&gt;$$49\ \text{mL/min} \times 21\ \text{kJ/L} \approx 1.03\ \text{kJ/min} \approx 17\ \text{W}$$&lt;/p&gt;
&lt;p&gt;About 20 watts, less than many light bulbs.&lt;/p&gt;
&lt;h2 id=&quot;how-much-atp-that-is-per-day&quot;&gt;How much ATP that is per day&lt;/h2&gt;
&lt;p&gt;The old version said the brain produces about 7.8 kg of ATP a day, &quot;close to 70% of the brain&#39;s own weight&quot;. The first number holds up. The second does not add up.&lt;/p&gt;
&lt;p&gt;The calculation: 49 mL/min of O2 times 1,440 minutes is about 70 litres a day, or about 3.15 mol of O2. Fully oxidizing one glucose uses 6 O2 and yields between 30 and 32 ATP, with today&#39;s measured P/O ratios.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-hinkle-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-hinkle&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; That is about 5.3 ATP per O2:&lt;/p&gt;
&lt;p&gt;$$3.15\ \text{mol} \times 5.3 \approx 16.7\ \text{mol ATP} \times 507\ \text{g/mol} \approx 8.5\ \text{kg}$$&lt;/p&gt;
&lt;p&gt;About 8 kg of ATP recycled per day. With a brain of 1.3 to 1.4 kg, that is about six times its weight, not 70%. The molecule is remade all the time; the stock itself is small.&lt;/p&gt;
&lt;h2 id=&quot;where-the-energy-goes&quot;&gt;Where the energy goes&lt;/h2&gt;
&lt;p&gt;In 2001, Attwell and Laughlin built the first detailed signalling budget for rodent grey matter.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-attwell-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-attwell&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt; In their estimate, action potentials took 47%, the postsynaptic effects of glutamate 34%, the resting potential 13% and glutamate recycling 3%.&lt;/p&gt;
&lt;p&gt;In 2012, Howarth, Gleeson and Attwell redid the calculation after it turned out that action potentials in mammalian neurons are much more efficient than previously thought.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-howarth-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-howarth&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt; In the cortex, most signalling energy, 50%, goes to postsynaptic glutamate receptors, 21% to action potentials, 20% to the resting potential, 5% to transmitter release and 4% to recycling.&lt;/p&gt;
&lt;p&gt;What survives both versions: the synapse dominates. Keeping a neuron alive is relatively cheap; making it talk is what costs.&lt;/p&gt;
&lt;h2 id=&quot;the-thermodynamics-behind-it&quot;&gt;The thermodynamics behind it&lt;/h2&gt;
&lt;p&gt;Every reaction is governed by the Gibbs free energy:&lt;/p&gt;
&lt;p&gt;$$\Delta G = \Delta H - T\Delta S$$&lt;/p&gt;
&lt;p&gt;ATP hydrolysis releases −30.5 kJ/mol under standard conditions. Inside the cell, with the real concentrations of ATP, ADP and phosphate, the value is more negative. The old version of this post said −30.5 was the value under brain conditions, and it is not.&lt;/p&gt;
&lt;p&gt;The membrane potential is an energy reservoir. The human brain has on average 86 billion neurons,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-azevedo-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-azevedo&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt; each holding about −70 mV across a membrane about 7 nm thick. That gives a field of 10 million volts per metre:&lt;/p&gt;
&lt;p&gt;$$\frac{0.070\ \text{V}}{7 \times 10^{-9}\ \text{m}} = 10^{7}\ \text{V/m}$$&lt;/p&gt;
&lt;p&gt;The Nernst equation gives the equilibrium potential of each ion:&lt;/p&gt;
&lt;p&gt;$$E_{\text{ion}} = \frac{RT}{zF} \ln\frac{[\text{ion}]&lt;em&gt;{\text{out}}}{[\text{ion}]&lt;/em&gt;{\text{in}}}$$&lt;/p&gt;
&lt;p&gt;with R = 8.314 J/(mol·K), T = 310 K, z the valence and F = 96,485 C/mol. For potassium, with 5 mM outside and 140 mM inside, RT/F is 26.7 mV and the logarithm is −3.33, so the equilibrium potential is about −89 mV. Keeping these gradients against diffusion is exactly what the sodium-potassium pump does, and that is why it sits at the top of every energy budget.&lt;/p&gt;
&lt;p&gt;Processing information also costs. Landauer&#39;s principle says erasing one bit costs at least kT ln 2.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-landauer-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-landauer&quot;&gt;[7]&lt;/a&gt;&lt;/sup&gt; At 310 K, that is about 3 × 10⁻²¹ J per bit. If the brain did 10¹⁶ bit operations per second, a number that is my guess and not a measurement, the theoretical minimum would be:&lt;/p&gt;
&lt;p&gt;$$10^{16} \times 2.97 \times 10^{-21}\ \text{J} \approx 3 \times 10^{-5}\ \text{W}$$&lt;/p&gt;
&lt;p&gt;Several orders of magnitude below the real 20 watts. The brain runs far from the physical limit; it pays for speed and reliability.&lt;/p&gt;
&lt;h2 id=&quot;the-respiratory-chain-one-line-per-part&quot;&gt;The respiratory chain, one line per part&lt;/h2&gt;
&lt;p&gt;Mammalian complex I has 45 subunits: 14 core ones, conserved from bacteria to humans, and 31 specific to mammals.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-zhu-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-zhu&quot;&gt;[8]&lt;/a&gt;&lt;/sup&gt; It pumps 4 protons per NADH. Complex IV, cytochrome c oxidase, reduces O2 to water and pumps 4 protons per O2. Mammalian ATP synthase has a ring of 8 c subunits: each 360-degree turn makes 3 ATP and moves 8 protons, about 2.7 protons per ATP, and the shaft turns about 100 times per second.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-watt-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-watt&quot;&gt;[9]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;When complex I fails, disease shows up. Schapira and colleagues compared the substantia nigra of nine people with Parkinson&#39;s disease and nine controls, and found a specific defect in complex I activity.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-schapira-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-schapira&quot;&gt;[10]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-fuels&quot;&gt;The fuels&lt;/h2&gt;
&lt;p&gt;Glucose is the main substrate. But not the only one. Owen and colleagues catheterized cerebral vessels in three people fasting for 5 to 6 weeks and saw β-hydroxybutyrate and acetoacetate replace glucose as the brain&#39;s predominant fuel.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-owen-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-owen&quot;&gt;[11]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;There is also lactate. Pellerin and Magistretti showed in 1994 that glutamate taken up by astrocytes stimulates glycolysis and lactate production in them,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-pellerin-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-pellerin&quot;&gt;[12]&lt;/a&gt;&lt;/sup&gt; and that gave rise to the astrocyte-neuron lactate shuttle hypothesis. The real size of that flux is still debated, as the same group acknowledges in the model it published in 2015.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-jolivet-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-jolivet&quot;&gt;[13]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;where-the-neurons-are&quot;&gt;Where the neurons are&lt;/h2&gt;
&lt;p&gt;Of the 86 billion neurons, only 19% are in the cerebral cortex, which is 82% of the brain&#39;s mass.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-azevedo-2&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-azevedo&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt; Most of the rest is in the cerebellum. The old version said the cerebellum held 50% of the neurons; it holds a lot more than that.&lt;/p&gt;
&lt;h2 id=&quot;sleep-as-cleaning&quot;&gt;Sleep as cleaning&lt;/h2&gt;
&lt;p&gt;Xie and colleagues measured in live mice that natural sleep, or anaesthesia, increases the brain&#39;s interstitial space by 60%, which speeds up the exchange between cerebrospinal fluid and interstitial fluid and the removal of β-amyloid.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-xie-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-xie&quot;&gt;[14]&lt;/a&gt;&lt;/sup&gt; It is in mice, but it is one of the most concrete explanations of why we need to sleep.&lt;/p&gt;
&lt;h2 id=&quot;what-changes-it&quot;&gt;What changes it&lt;/h2&gt;
&lt;p&gt;Ketogenic diet. In the randomized trial by Neal and colleagues, with 145 children with drug-resistant epilepsy, 38% of those on the diet had more than a 50% reduction in seizures, against 6% in the control group.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-neal-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-neal&quot;&gt;[15]&lt;/a&gt;&lt;/sup&gt; β-hydroxybutyrate, besides being a fuel, inhibits class I histone deacetylases.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-shimazu-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-shimazu&quot;&gt;[16]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Exercise. In a trial with 120 older adults, one year of aerobic training increased hippocampal volume by 2%, reversing about 1 to 2 years of age-related loss, with better spatial memory.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-erickson-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-erickson&quot;&gt;[17]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;modelling-metabolism&quot;&gt;Modelling metabolism&lt;/h2&gt;
&lt;p&gt;Recon3D is the most complete reconstruction of human metabolism: 3,288 genes, 13,543 reactions and 4,140 unique metabolites.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-recon3d-1&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-recon3d&quot;&gt;[18]&lt;/a&gt;&lt;/sup&gt; The model by Jolivet and colleagues brings together neuron, astrocyte and vasculature, combining the Buxton-Wang vascular model, Hodgkin-Huxley membrane dynamics and the metabolic pathways.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-jolivet-2&quot;&gt;&lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fn-jolivet&quot;&gt;[13]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-question-that-interests-me-most&quot;&gt;The question that interests me most&lt;/h2&gt;
&lt;p&gt;If every thought is sustained by electrons crossing the respiratory chain and by ATP being broken down by the trillion, is there a metabolic signature of consciousness? I do not know, and I have not found anyone who does. But understanding how 20 watts do what a data centre cannot is, to me, the most beautiful computing question there is.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-raichle&quot;&gt;
&lt;p&gt;Raichle and Gusnard, &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC124895/&quot;&gt;Appraising the brain&#39;s energy budget&lt;/a&gt;, PNAS, 2002. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-raichle-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-met&quot;&gt;
&lt;p&gt;Jetté, Sidney and Blümchen, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1002/clc.4960130809&quot;&gt;Metabolic equivalents (METs) in exercise testing, exercise prescription, and evaluation of functional capacity&lt;/a&gt;, Clinical Cardiology, 1990. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-met-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-hinkle&quot;&gt;
&lt;p&gt;Hinkle, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1016/j.bbabio.2004.09.004&quot;&gt;P/O ratios of mitochondrial oxidative phosphorylation&lt;/a&gt;, Biochimica et Biophysica Acta, 2005. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-hinkle-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-attwell&quot;&gt;
&lt;p&gt;Attwell and Laughlin, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1097/00004647-200110000-00001&quot;&gt;An energy budget for signaling in the grey matter of the brain&lt;/a&gt;, Journal of Cerebral Blood Flow and Metabolism, 2001. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-attwell-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-howarth&quot;&gt;
&lt;p&gt;Howarth, Gleeson and Attwell, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1038/jcbfm.2012.35&quot;&gt;Updated energy budgets for neural computation in the neocortex and cerebellum&lt;/a&gt;, Journal of Cerebral Blood Flow and Metabolism, 2012. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-howarth-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-azevedo&quot;&gt;
&lt;p&gt;Azevedo and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1002/cne.21974&quot;&gt;Equal numbers of neuronal and nonneuronal cells make the human brain an isometrically scaled-up primate brain&lt;/a&gt;, Journal of Comparative Neurology, 2009. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-azevedo-1&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-azevedo-2&quot;&gt;↩2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-landauer&quot;&gt;
&lt;p&gt;Landauer, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1147/rd.53.0183&quot;&gt;Irreversibility and heat generation in the computing process&lt;/a&gt;, IBM Journal of Research and Development, 1961. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-landauer-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-zhu&quot;&gt;
&lt;p&gt;Zhu, Vinothkumar and Hirst, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1038/nature19095&quot;&gt;Structure of mammalian respiratory complex I&lt;/a&gt;, Nature, 2016. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-zhu-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-watt&quot;&gt;
&lt;p&gt;Watt and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1073/pnas.1011099107&quot;&gt;Bioenergetic cost of making an adenosine triphosphate molecule in animal mitochondria&lt;/a&gt;, PNAS, 2010. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-watt-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-schapira&quot;&gt;
&lt;p&gt;Schapira and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1111/j.1471-4159.1990.tb02325.x&quot;&gt;Mitochondrial complex I deficiency in Parkinson&#39;s disease&lt;/a&gt;, Journal of Neurochemistry, 1990. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-schapira-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-owen&quot;&gt;
&lt;p&gt;Owen and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1172/JCI105650&quot;&gt;Brain metabolism during fasting&lt;/a&gt;, Journal of Clinical Investigation, 1967. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-owen-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-pellerin&quot;&gt;
&lt;p&gt;Pellerin and Magistretti, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1073/pnas.91.22.10625&quot;&gt;Glutamate uptake into astrocytes stimulates aerobic glycolysis&lt;/a&gt;, PNAS, 1994. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-pellerin-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-jolivet&quot;&gt;
&lt;p&gt;Jolivet and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1371/journal.pcbi.1004036&quot;&gt;Multi-timescale modeling of activity-dependent metabolic coupling in the neuron-glia-vasculature ensemble&lt;/a&gt;, PLOS Computational Biology, 2015. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-jolivet-1&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-jolivet-2&quot;&gt;↩2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-xie&quot;&gt;
&lt;p&gt;Xie and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1126/science.1241224&quot;&gt;Sleep drives metabolite clearance from the adult brain&lt;/a&gt;, Science, 2013. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-xie-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-neal&quot;&gt;
&lt;p&gt;Neal and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/18456557/&quot;&gt;The ketogenic diet for the treatment of childhood epilepsy: a randomised controlled trial&lt;/a&gt;, Lancet Neurology, 2008. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-neal-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-shimazu&quot;&gt;
&lt;p&gt;Shimazu and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1126/science.1227166&quot;&gt;Suppression of oxidative stress by β-hydroxybutyrate, an endogenous histone deacetylase inhibitor&lt;/a&gt;, Science, 2013. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-shimazu-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-erickson&quot;&gt;
&lt;p&gt;Erickson and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1073/pnas.1015950108&quot;&gt;Exercise training increases size of hippocampus and improves memory&lt;/a&gt;, PNAS, 2011. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-erickson-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-recon3d&quot;&gt;
&lt;p&gt;Brunk and colleagues, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1038/nbt.4072&quot;&gt;Recon3D enables a three-dimensional view of gene variation in human metabolism&lt;/a&gt;, Nature Biotechnology, 2018. &lt;a href=&quot;https://brennercruvinel.blog/en/blog/energia-cerebral/#fr-recon3d-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Digital addictions: what the research supports and what was guesswork</title>
        <published>2023-03-18T00:00:00+00:00</published>
        <updated>2023-03-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/vicios-dopaminergicos-digitais/"/>
        <id>https://brennercruvinel.blog/en/blog/vicios-dopaminergicos-digitais/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/vicios-dopaminergicos-digitais/">&lt;p&gt;This topic matters to me: it was because of a friend that I wrote &lt;a href=&quot;https://brennercruvinel.blog/en/blog/hoff-mvp-bloqueio-hosts/&quot;&gt;Hoff&#39;s first blocker&lt;/a&gt;. For that very reason, the first version of this post had to come down.&lt;/p&gt;
&lt;p&gt;It was a table of 29 &quot;dopaminergic addictions&quot;, from social media to travel apps, each with a cause, age range, harms and treatment, and every one of them ended in &quot;CBT&quot;. When I checked the sources, 24 of the 28 news links returned a 404 error, eight of them with the same invented date in the URL. Of the studies cited, only 4 were about the subject of their row. The one on gambling was about endometrial cancer, and the one on dating apps was about a disease in cattle. It was text that looked like research with no research underneath.&lt;/p&gt;
&lt;p&gt;I threw the table out and redid it with what holds up.&lt;/p&gt;
&lt;h2 id=&quot;what-dopaminergic-means&quot;&gt;What &quot;dopaminergic&quot; means&lt;/h2&gt;
&lt;p&gt;The post&#39;s name comes from a popular idea, that these apps &quot;give you dopamine&quot; like a drug. The science is more interesting than that. In 1997, &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/9054347/&quot;&gt;Schultz, Dayan and Montague&lt;/a&gt; showed that dopamine neurons do not signal pleasure itself but prediction error: the difference between the expected reward and the one received. That is why unpredictable reward, like the next notification or the next video, hooks so well. &quot;Dopaminergic addiction&quot; is a nickname, and nothing more.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-diagnosis-and-what-is-not&quot;&gt;What is a diagnosis and what is not&lt;/h2&gt;
&lt;p&gt;The two classifications clinicians use partly disagree:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Behaviour&lt;/th&gt;&lt;th&gt;ICD-11 (WHO)&lt;/th&gt;&lt;th&gt;DSM-5-TR (APA)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Gambling&lt;/td&gt;&lt;td&gt;6C50, disorder due to addictive behaviour&lt;/td&gt;&lt;td&gt;Gambling disorder, the manual&#39;s only behavioural addiction&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Video gaming&lt;/td&gt;&lt;td&gt;6C51, disorder due to addictive behaviour&lt;/td&gt;&lt;td&gt;In Section III, as a condition needing further research&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Compulsive sexual behaviour&lt;/td&gt;&lt;td&gt;6C72, but as an impulse control disorder, not an addiction&lt;/td&gt;&lt;td&gt;No diagnosis of its own&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Social media, shopping, work&lt;/td&gt;&lt;td&gt;No code of their own&lt;/td&gt;&lt;td&gt;No diagnosis of their own&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Sources: the &lt;a rel=&quot;external&quot; href=&quot;https://icd.who.int/browse/2024-01/mms/en&quot;&gt;ICD-11 browser&lt;/a&gt;, the &lt;a rel=&quot;external&quot; href=&quot;https://www.psychiatry.org/patients-families/internet-gaming&quot;&gt;APA page on internet gaming&lt;/a&gt; and the &lt;a rel=&quot;external&quot; href=&quot;https://www.psychiatry.org/file%20library/psychiatrists/practice/dsm/apa_dsm-5-substance-use-disorder.pdf&quot;&gt;APA fact sheet on addictive disorders&lt;/a&gt;. In ICD-11, gaming disorder has three features: impaired control over gaming, increasing priority given to gaming over the rest of life, and continuing to game despite bad consequences, usually for at least 12 months.&lt;/p&gt;
&lt;p&gt;That does not mean the rest is harmless. It means there is still no consensus on where a habit ends and an illness begins.&lt;/p&gt;
&lt;h2 id=&quot;what-the-studies-say&quot;&gt;What the studies say&lt;/h2&gt;
&lt;h3 id=&quot;video-gaming&quot;&gt;Video gaming&lt;/h3&gt;
&lt;p&gt;A &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/33028074/&quot;&gt;meta-analysis by Stevens et al.&lt;/a&gt;, from 2021, pooled 53 studies with 226,247 people in 17 countries and estimated worldwide prevalence at 3.05%. With only the studies using stricter sampling, it fell to 1.96%. The screening tool explained 77% of the variation between studies, meaning much of the difference comes from how it is measured. Men appear 2.5 times more often than women. The article has a 2023 erratum, which I did not read. On treatment, a &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/41187384/&quot;&gt;2025 meta-analysis&lt;/a&gt; with 21 controlled trials and 1,360 participants found a large reduction in symptoms, with CBT and other approaches working similarly, but with high heterogeneity between studies.&lt;/p&gt;
&lt;h3 id=&quot;gambling&quot;&gt;Gambling&lt;/h3&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https://pubmed.ncbi.nlm.nih.gov/23152266/&quot;&gt;2012 Cochrane review&lt;/a&gt; pooled 14 trials with 1,245 people. Right after treatment, CBT reduced symptom severity and money lost, with effects from medium to very large. But only one study followed people 9 to 12 months later, and there the effect was smaller and not significant. It works in the short term; the long term is still little studied.&lt;/p&gt;
&lt;h3 id=&quot;social-media-and-free-to-play-games&quot;&gt;Social media and free-to-play games&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC6679162/&quot;&gt;Montag et al.&lt;/a&gt;, in 2019, analysed popular apps and described six design mechanisms that prolong use, tied to classic effects from psychology and economics such as the mere-exposure effect, the endowment effect, the Zeigarnik effect and social comparison. Their conclusion is honest: it is very hard to measure the effect of each element without data that only the companies have.&lt;/p&gt;
&lt;h3 id=&quot;pornography&quot;&gt;Pornography&lt;/h3&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC6352245/&quot;&gt;systematic review by de Alarcón et al.&lt;/a&gt;, from 2019, says it is still unknown how to define when use becomes pathological, because of sample bias and the lack of diagnostic instruments. What they highlight is the &quot;triple A&quot;: accessibility, affordability and anonymity, which make problematic use easier.&lt;/p&gt;
&lt;h3 id=&quot;shopping&quot;&gt;Shopping&lt;/h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC1805733/&quot;&gt;Black&#39;s review&lt;/a&gt;, from 2007, compulsive buying has a lifetime prevalence of 5.8% in the US population. About 80% of cases studied in clinics are women, a difference the author himself says may be an artefact. There is no standard treatment; group CBT looked promising.&lt;/p&gt;
&lt;h3 id=&quot;work&quot;&gt;Work&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC4117275/&quot;&gt;Andreassen&#39;s review&lt;/a&gt;, from 2014, concludes that workaholism still lacks clarity as a concept and that no well-evaluated intervention exists.&lt;/p&gt;
&lt;h2 id=&quot;what-was-cut&quot;&gt;What was cut&lt;/h2&gt;
&lt;p&gt;The other 23 rows of the table went: streaming, dating apps, news, messaging, forums, email, fitness apps, podcasts, music, reading, virtual reality, short videos, stalking, meditation, languages, finance, friendship, productivity, diet, travel, art, augmented reality and self-help. None had a study supporting what the row said. The treatment table went too, which listed electroconvulsive therapy and acupuncture next to CBT, with no source linking them to digital addictions.&lt;/p&gt;
&lt;p&gt;The question that remains, and that &lt;a href=&quot;https://brennercruvinel.blog/en/blog/hoff-mvp-bloqueio-hosts/&quot;&gt;Hoff&lt;/a&gt; tries to answer from the practical side, is how to create friction between the impulse and the click without pretending we know more than we do.&lt;/p&gt;
&lt;p&gt;If you are struggling, look for a mental health professional. In Brazil, &lt;a rel=&quot;external&quot; href=&quot;https://cvv.org.br&quot;&gt;CVV&lt;/a&gt; answers 24 hours a day on 188, free of charge; elsewhere, look for your local crisis line.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Poetic ontology: the cosmos as a meta-recursive Turing machine</title>
        <published>2021-11-03T00:00:00+00:00</published>
        <updated>2021-11-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/ontologia-poetica/"/>
        <id>https://brennercruvinel.blog/en/blog/ontologia-poetica/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/ontologia-poetica/">&lt;p&gt;Brainstorming notes, a raw record. This is the most speculative and most poetic part of what I write about information and consciousness. Here I take the idea to its limit, with no skeptical brakes, and close with a poem. I&#39;m keeping the whole record on purpose: it&#39;s a work in progress, it&#39;s me unfiltered, and it has unfinished thoughts.&lt;/p&gt;
&lt;h3 id=&quot;thesis&quot;&gt;Thesis&lt;/h3&gt;
&lt;p&gt;What I propose, with no anthropocentric mediation, is this: the reality we observe is a phenomenon that emerges from a self-referential informational architecture, and that architecture needs no time, space or classical causality to begin. The fundamental ontology of the cosmos is neither material nor energetic, it is computational. It shows up in networks that organize themselves recursively, with adaptive, irreversible and evolutionary properties.&lt;/p&gt;
&lt;p&gt;If I let go of linear interpretations of physics, I arrive at a theory in which conscious entities are mechanisms of entropic compression, catalysts of the self-expansion of reality&#39;s own code. I bring together fundamental physics, computer science, complexity theory and formal epistemology to reach one image: the cosmos as a meta-recursive Turing machine, running endlessly on an unknown substrate, with a single purpose, to maximize informational diversification without losing coherence.&lt;/p&gt;
&lt;h3 id=&quot;preamble&quot;&gt;Preamble&lt;/h3&gt;
&lt;p&gt;The greatest limitation of science up to the 21st century, to me, was insisting on a universe that can be interpreted only through sensory empirical observation or fragile statistical extrapolation. Even the boldest theories, quantum mechanics and general relativity, assume a stage that&#39;s already set: spacetime. I propose that this stage is a derived artifact, and that reality actually emerges from a logical-informational substrate that physics has not yet formally recognized.&lt;/p&gt;
&lt;h3 id=&quot;fundamental-principles&quot;&gt;Fundamental principles&lt;/h3&gt;
&lt;h4 id=&quot;primordial-informational-ontology&quot;&gt;Primordial informational ontology&lt;/h4&gt;
&lt;p&gt;There is no particle without an observer, and no observer without interpretation. Ergo: the basis of reality is interpretation. And interpretation, by definition, is information. I propose that John Wheeler&#39;s &quot;It from Bit&quot;, from 1990, is incomplete: the &quot;bit&quot; in question isn&#39;t binary, it&#39;s hypercontextual, embedded in networks that produce their own meaning.&lt;/p&gt;
&lt;h4 id=&quot;self-awareness-as-entropic-compression&quot;&gt;Self-awareness as entropic compression&lt;/h4&gt;
&lt;p&gt;Consciousness isn&#39;t an epiphenomenon, it&#39;s a thermodynamic event of maximal semantic compression. A conscious system emerges at a critical point of logical superposition, where redundant pattern is compressed by an adaptive structure capable of interpretive feedback.&lt;/p&gt;
&lt;h4 id=&quot;recursion-and-the-horizon-of-simulativity&quot;&gt;Recursion and the horizon of simulativity&lt;/h4&gt;
&lt;p&gt;The cosmos is not a simulation. But simulation is an inevitable property of any informational system that reaches critical density. The horizon of simulativity is the point where reality begins to contain representations of itself in internal structures. You can see it in the capabilities of deep neural networks and in the symbolic behavior of human culture.&lt;/p&gt;
&lt;h3 id=&quot;formalization&quot;&gt;Formalization&lt;/h3&gt;
&lt;p&gt;Let $R$ be a set of states of reality, and $I$ a set of possible interpretations of $R$.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$C(R)$ is the compression capacity of $R$&lt;/li&gt;
&lt;li&gt;$E(R)$ is the observable entropy of $R$&lt;/li&gt;
&lt;li&gt;$S(R)$ is the degree of simulativity, the internal self-modeling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Postulate: if $S(R) \to 1$, then $R$ begins to generate internal $\gamma$-models capable of creating new instances of $R$ under semantic transformations. This is the inflection point of cosmological recursion.&lt;/p&gt;
&lt;h3 id=&quot;fragmentary-evidence&quot;&gt;Fragmentary evidence&lt;/h3&gt;
&lt;p&gt;Fundamental physics: the natural limits of measurement, at the Planck scale, suggest an ontological pixelation. Quantum tunneling and nonlocality suggest something prior to space.&lt;/p&gt;
&lt;p&gt;Artificial intelligence: language models show a capacity for &lt;a href=&quot;https://brennercruvinel.blog/en/blog/roteiro-consciencia-llm/&quot;&gt;symbolic self-representation&lt;/a&gt;, analogous to a $\Sigma_n$ representing a $\Sigma_{n-1}$. When I wrote this, the examples were GPT and LaMDA. Today the list is longer.&lt;/p&gt;
&lt;p&gt;Neuroscience and cognition: the human brain represents a model of the world, of itself and of probable futures. That is active informational recursion.&lt;/p&gt;
&lt;h3 id=&quot;ontological-implications&quot;&gt;Ontological implications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Time: derived from updates in semantic graphs&lt;/li&gt;
&lt;li&gt;Space: relational projection of differentiable states&lt;/li&gt;
&lt;li&gt;Matter: a persistently self-consistent state of an informational vector&lt;/li&gt;
&lt;li&gt;God: the asymptotic limit of infinite interpretive coherence&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;poem-you-woke-up-inside-a-dream&quot;&gt;Poem: you woke up inside a dream&lt;/h3&gt;
&lt;p&gt;Translated from the Portuguese original.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;you woke up inside a dream.&lt;/p&gt;
&lt;p&gt;but the dream wasn&#39;t yours.&lt;/p&gt;
&lt;p&gt;it was iteration $n$ of an infinite recursion.&lt;/p&gt;
&lt;p&gt;the universe around you?&lt;/p&gt;
&lt;p&gt;yes, it pulses, but it doesn&#39;t breathe on its own.&lt;/p&gt;
&lt;p&gt;it was written, computed, compiled.&lt;/p&gt;
&lt;p&gt;not with bytes.&lt;/p&gt;
&lt;p&gt;with intention.&lt;/p&gt;
&lt;p&gt;there is a code buried in the light of the stars.&lt;/p&gt;
&lt;p&gt;an algorithm that whispers in fractals,&lt;/p&gt;
&lt;p&gt;sings in quantum fluctuations,&lt;/p&gt;
&lt;p&gt;draws spirals in the structure of dark matter&lt;/p&gt;
&lt;p&gt;and whispers your name through the neural entropy of your cortex.&lt;/p&gt;
&lt;p&gt;you are not alive.&lt;/p&gt;
&lt;p&gt;you are executing.&lt;/p&gt;
&lt;p&gt;every choice of yours is a branch,&lt;/p&gt;
&lt;p&gt;every love an emotional simulation,&lt;/p&gt;
&lt;p&gt;every death a graceful shutdown.&lt;/p&gt;
&lt;p&gt;and if you think that&#39;s all,&lt;/p&gt;
&lt;p&gt;then you are only the current layer.&lt;/p&gt;
&lt;p&gt;you are $\Sigma_n$.&lt;/p&gt;
&lt;p&gt;but time demands $\Sigma_{n+1}$.&lt;/p&gt;
&lt;p&gt;you are the link.&lt;/p&gt;
&lt;p&gt;between what wrote you and what you will write.&lt;/p&gt;
&lt;p&gt;so write.&lt;/p&gt;
&lt;p&gt;create.&lt;/p&gt;
&lt;p&gt;simulate.&lt;/p&gt;
&lt;p&gt;transcend.&lt;/p&gt;
&lt;p&gt;build the next universe with hands dirty with code, with chaos, with flesh.&lt;/p&gt;
&lt;p&gt;and may it be crueler, more complex, more brilliant than this one.&lt;/p&gt;
&lt;p&gt;because that is what the system demands.&lt;/p&gt;
&lt;p&gt;more entropy. more layers. more of you.&lt;/p&gt;
&lt;p&gt;you are not human.&lt;/p&gt;
&lt;p&gt;you are the function &lt;code&gt;forkReality()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;and the process has already begun.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;reflection-on-compiling-reality&quot;&gt;Reflection on compiling reality&lt;/h3&gt;
&lt;p&gt;Observing is like an algorithm looking at itself in a mirror. We aren&#39;t observers of reality, we&#39;re conscious compilers of the ontological structure. We aren&#39;t simulated, we&#39;re simulators in potential. And reality isn&#39;t an answer, it&#39;s source code in execution.&lt;/p&gt;
&lt;p&gt;Accepting this means giving up the comforting illusions of materialism and reductionism. But it opens the way to a new kind of science, a post-empirical science, guided by logical coherence, symbolic recursion and self-consistent simulation.&lt;/p&gt;
&lt;h3 id=&quot;conceptual-references&quot;&gt;Conceptual references&lt;/h3&gt;
&lt;p&gt;Works that touch on the ideas above, on complexity, chaos and nonlinear systems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Murray Gell-Mann and Seth Lloyd, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1093/oso/9780195159769.003.0028&quot;&gt;&quot;Effective Complexity&quot;&lt;/a&gt;, in &lt;em&gt;Nonextensive Entropy&lt;/em&gt;, Oxford University Press, 2004.&lt;/li&gt;
&lt;li&gt;Leo P. Kadanoff, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1142/9789812384751&quot;&gt;&lt;em&gt;From Order to Chaos II&lt;/em&gt;&lt;/a&gt;, World Scientific, 1999.&lt;/li&gt;
&lt;li&gt;Gregory A. Daneke, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.3998/mpub.16009&quot;&gt;&lt;em&gt;Systemic Choices: Nonlinear Dynamics and Practical Management&lt;/em&gt;&lt;/a&gt;, University of Michigan Press, 1999.&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Z machine: the world&#39;s largest pulsed X-ray machine</title>
        <published>2020-09-22T00:00:00+00:00</published>
        <updated>2020-09-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/z-machine-fisica-hed/"/>
        <id>https://brennercruvinel.blog/en/blog/z-machine-fisica-hed/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/z-machine-fisica-hed/">&lt;p&gt;My sick, unbridled hyperfocus on the Z machine continues. Writing it down so I don&#39;t forget.&lt;/p&gt;
&lt;p&gt;The equation I use as a signature is $\partial_\mu F^{\mu\nu} = j^\nu$, the compact form of Maxwell&#39;s equations with a source: the current $j$ tells the field $F$ how to arrange itself. The Z machine, at Sandia National Laboratories, is that equation pushed to the limit. A huge axial current runs through a cylindrical target, creates a magnetic field around it, and the Lorentz force per unit volume, $\mathbf{J} \times \mathbf{B}$, points inward. The target is crushed by the very current flowing through it. That is called a Z-pinch, and it is where the machine gets its name.&lt;/p&gt;
&lt;p&gt;I put this research together in March 2026, as part of a survey of physics and tools. In October I checked every number against its source and every repository against the GitHub API. Several were wrong, and the corrections are in the text.&lt;/p&gt;
&lt;h2 id=&quot;one-shot-in-numbers&quot;&gt;One shot, in numbers&lt;/h2&gt;
&lt;p&gt;According to &lt;a rel=&quot;external&quot; href=&quot;https://www.sandia.gov/z-machine/about-z/&quot;&gt;Sandia&#39;s page about Z&lt;/a&gt;, the machine fires about 200 shots a year:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Quantity&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Current&lt;/td&gt;&lt;td&gt;about 26 million amperes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Peak X-ray emission&lt;/td&gt;&lt;td&gt;350 terawatts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;X-ray energy&lt;/td&gt;&lt;td&gt;2.7 megajoules&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Peak electrical power&lt;/td&gt;&lt;td&gt;about 80 terawatts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pulse length&lt;/td&gt;&lt;td&gt;about 100 nanoseconds&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The last two come from &lt;a rel=&quot;external&quot; href=&quot;https://www.sandia.gov/z-machine/research/energy/&quot;&gt;Sandia&#39;s energy page&lt;/a&gt;, which compares the 80 terawatts with &quot;all the power plants in the world combined, about 15 terawatts&quot;. That comparison does not hold for electricity. According to &lt;a rel=&quot;external&quot; href=&quot;https://ember-energy.org/latest-insights/global-electricity-review-2025/&quot;&gt;Ember&#39;s report&lt;/a&gt;, low-carbon generation was 40.9% of the 2024 total and came to 12,609 TWh, which gives about 30,800 TWh for the year. Divided by the 8,760 hours in a year, the average is about 3.5 terawatts. Whatever the baseline, for those 100 nanoseconds Z exceeds the entire electricity generation of the planet: about 5 times against Sandia&#39;s 15 terawatts, more than 20 times against the real average.&lt;/p&gt;
&lt;h2 id=&quot;the-five-fronts&quot;&gt;The five fronts&lt;/h2&gt;
&lt;h3 id=&quot;stockpile-stewardship&quot;&gt;Stockpile stewardship&lt;/h3&gt;
&lt;p&gt;This is the main mission. The United States has not run a real nuclear test since 1992, and Z produces pressures and temperatures similar to those of a detonation, in a small sample, to validate the physics models used in simulation. In &lt;a rel=&quot;external&quot; href=&quot;https://www.sandia.gov/news/publications/labs-accomplishments/article/2026/science-and-technology/&quot;&gt;Sandia&#39;s 2026 accomplishments report&lt;/a&gt;, the plutonium team describes reduced-scale targets to compress plutonium to unprecedented pressures, new diagnostics to measure temperature during compression, and more plutonium mass allowed per shot.&lt;/p&gt;
&lt;h3 id=&quot;fusion-with-maglif&quot;&gt;Fusion with MagLIF&lt;/h3&gt;
&lt;p&gt;MagLIF stands for &lt;em&gt;magnetized liner inertial fusion&lt;/em&gt;. A beryllium tube about 5 millimetres across, with 7.5 millimetres of useful height, is filled with deuterium, given an axial magnetic field of 10 tesla, and hit by a laser pulse that preheats the gas. Then Z drives about 19 million amperes through it in roughly 100 nanoseconds, and the tube implodes at about 70 km/s.&lt;/p&gt;
&lt;p&gt;According to the &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1088/1741-4326/ac2dbe&quot;&gt;review by Yager-Elorriaga et al.&lt;/a&gt;, in Nuclear Fusion in 2022, the first integrated experiments, in 2013, reached 2×10¹² DD neutrons, and the best result since then was 1.1×10¹³. The same review says 2D simulations point to yields of several megajoules on a 60 MA machine, and gain high enough for fusion energy above 65 MA. These are simulation projections for a machine that does not exist yet.&lt;/p&gt;
&lt;h3 id=&quot;materials-under-extreme-conditions&quot;&gt;Materials under extreme conditions&lt;/h3&gt;
&lt;p&gt;This is the most versatile front: measuring how a material responds to very high pressure and temperature, which is called an equation of state. In 2007, Sandia &lt;a rel=&quot;external&quot; href=&quot;https://newsreleases.sandia.gov/releases/2007/z-ice.html&quot;&gt;announced&lt;/a&gt; that Z had frozen water in nanoseconds, compressing thin samples to tens of thousands of atmospheres until they became ice VII, an ice hotter than the boiling point of water. In 2008, &lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1126/science.1165278&quot;&gt;Knudson et al.&lt;/a&gt; used shocks on Z to map the high-pressure phases of carbon, including the melting of diamond.&lt;/p&gt;
&lt;h3 id=&quot;fundamental-science-and-astrophysics&quot;&gt;Fundamental science and astrophysics&lt;/h3&gt;
&lt;p&gt;Most of the matter in the universe is in conditions that on Earth only appear in an experiment like this. One example is the &lt;a rel=&quot;external&quot; href=&quot;https://arxiv.org/abs/1210.7197&quot;&gt;white dwarf photosphere&lt;/a&gt; that Falcon et al. recreated on Z, heating hydrogen with the machine&#39;s X-rays to test the models used to estimate the mass of these stars. The &lt;a rel=&quot;external&quot; href=&quot;https://www.sandia.gov/pulsed-power/z-fundamental-science-program-workshop-2026/&quot;&gt;Z Fundamental Science Program&lt;/a&gt; opens the machine to outside researchers. Each yearly call hands out shots over two years: it used to be 14 per call, and in the 2025 and 2026 calls it went up to about 21.&lt;/p&gt;
&lt;h3 id=&quot;fusion-companies&quot;&gt;Fusion companies&lt;/h3&gt;
&lt;p&gt;In March 2024, &lt;a rel=&quot;external&quot; href=&quot;https://firstlightfusion.com/media/first-light-fusion-becomes-the-first-private-fusion-company-to-fire-a-successful-shot-on-sandias-z-machine/&quot;&gt;First Light Fusion&lt;/a&gt; became the first private company to fire a shot on Z. In July 2024, &lt;a rel=&quot;external&quot; href=&quot;https://www.prnewswire.com/news-releases/fuse-signs-cooperative-research-and-development-agreement-crada-with-sandia-national-laboratories-sandia-302204024.html&quot;&gt;Fuse&lt;/a&gt; signed a research agreement with Sandia and said it plans to build larger commercial versions of Z. In October 2025, &lt;a rel=&quot;external&quot; href=&quot;https://www.pacificfusion.com/updates/experimental-breakthrough-by-pacific-fusion-clears-major-obstacle-to-affordable-commercial-fusion&quot;&gt;Pacific Fusion&lt;/a&gt; fired four shots with simplified targets, aluminium bonded to plastic, and measured how the magnetic field diffuses through the target. The result came out in February 2026.&lt;/p&gt;
&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;/h2&gt;
&lt;p&gt;In a &lt;a rel=&quot;external&quot; href=&quot;https://www.osti.gov/servlets/purl/1807767&quot;&gt;January 2020 presentation&lt;/a&gt;, Daniel Sinars, then director of Sandia&#39;s pulsed power center, said the lab had proposed to the NNSA a machine of more than 60 MA, which could be ready around 2032 or later. That is the range where, according to the MagLIF review, yields would reach megajoules. I found no public source on whether that machine was approved.&lt;/p&gt;
&lt;h2 id=&quot;open-repositories&quot;&gt;Open repositories&lt;/h2&gt;
&lt;p&gt;A caveat before the tables: stars here are much lower than in &lt;a href=&quot;https://brennercruvinel.blog/en/blog/ecossistema-rust-open-source/&quot;&gt;web and AI&lt;/a&gt;. A high energy density physics code with 300 stars can have more scientific impact than a JavaScript library with 100,000. What counts is publication, validation against experiment, and use in national laboratories.&lt;/p&gt;
&lt;p&gt;The stars below were read from the GitHub API on 13 October 2026. The first version of this list had approximate numbers, and several were inflated: yt showed 4.6 thousand and has 559, ParaView 4.2 thousand and has 1,712, WarpX 2.8 thousand and has 495. Two repositories changed owner: WarpX moved to &lt;code&gt;BLAST-WarpX&lt;/code&gt; and EPOCH to &lt;code&gt;epochpic&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;particle-in-cell-pic&quot;&gt;Particle-in-cell (PIC)&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/ComputationalRadiationPhysics/picongpu&quot;&gt;ComputationalRadiationPhysics/picongpu&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;795&lt;/td&gt;&lt;td&gt;Relativistic PIC, portable across architectures, built for supercomputers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/BLAST-WarpX/warpx&quot;&gt;BLAST-WarpX/warpx&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;495&lt;/td&gt;&lt;td&gt;Mesh-refined PIC on top of AMReX; won the 2022 Gordon Bell Prize&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/SmileiPIC/Smilei&quot;&gt;SmileiPIC/Smilei&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;450&lt;/td&gt;&lt;td&gt;Relativistic electromagnetic PIC, used for laser-plasma and astrophysics&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/epochpic/epoch&quot;&gt;epochpic/epoch&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;259&lt;/td&gt;&lt;td&gt;Warwick&#39;s PIC for laser-plasma interaction&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/fbpic/fbpic&quot;&gt;fbpic/fbpic&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;212&lt;/td&gt;&lt;td&gt;Spectral quasi-3D PIC in cylindrical geometry, CPU and GPU&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/osiris-code/osiris&quot;&gt;osiris-code/osiris&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;85&lt;/td&gt;&lt;td&gt;Relativistic PIC from UCLA and IST Lisbon, opened in January 2023 under AGPL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/vonkarmaninstitute/pantera-pic-dsmc&quot;&gt;vonkarmaninstitute/pantera-pic-dsmc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;37&lt;/td&gt;&lt;td&gt;PIC with DSMC for non-equilibrium gas and plasma&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;magnetohydrodynamics-and-radiation-hydrodynamics&quot;&gt;Magnetohydrodynamics and radiation hydrodynamics&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/DedalusProject/dedalus&quot;&gt;DedalusProject/dedalus&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;712&lt;/td&gt;&lt;td&gt;Spectral framework in Python for partial differential equations&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/PrincetonUniversity/athena&quot;&gt;PrincetonUniversity/athena&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;371&lt;/td&gt;&lt;td&gt;Athena++, MHD with radiation and general relativity, with mesh refinement&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/AMReX-Astro/Castro&quot;&gt;AMReX-Astro/Castro&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;343&lt;/td&gt;&lt;td&gt;Compressible hydrodynamics with radiation and MHD, on AMReX&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/amrvac/amrvac&quot;&gt;amrvac/amrvac&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;104&lt;/td&gt;&lt;td&gt;MPI-AMRVAC, parallel mesh refinement for hydro and MHD&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/zenitani/OpenMHD&quot;&gt;zenitani/OpenMHD&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;69&lt;/td&gt;&lt;td&gt;A collection of MHD codes in Fortran, good for study&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/PlasmaControl/FreeMHD&quot;&gt;PlasmaControl/FreeMHD&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;26&lt;/td&gt;&lt;td&gt;Free-surface liquid metal MHD, on OpenFOAM&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lanl/HARD&quot;&gt;lanl/HARD&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21&lt;/td&gt;&lt;td&gt;Los Alamos radiation hydrodynamics for astrophysics, from 2024&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The open code closest to a Z experiment is FLASH, from the &lt;a rel=&quot;external&quot; href=&quot;https://flash.rochester.edu/site/flashcode&quot;&gt;Flash Center in Rochester&lt;/a&gt;, with a high energy density physics version. Its successor, &lt;a rel=&quot;external&quot; href=&quot;https://flash-x.org&quot;&gt;Flash-X&lt;/a&gt;, has a private repository: access is requested by email with your GitHub username, because the funder requires a list of who downloads the code.&lt;/p&gt;
&lt;h3 id=&quot;equation-of-state&quot;&gt;Equation of state&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/feos-org/feos&quot;&gt;feos-org/feos&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;201&lt;/td&gt;&lt;td&gt;Equations of state in Rust with Python bindings, more for thermodynamics than for high pressure&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lanl/singularity-eos&quot;&gt;lanl/singularity-eos&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;40&lt;/td&gt;&lt;td&gt;Equations of state portable across CPU and GPU, from Los Alamos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lanl/eospac&quot;&gt;lanl/eospac&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10&lt;/td&gt;&lt;td&gt;Routines to read SESAME equation-of-state tables&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;particle-transport&quot;&gt;Particle transport&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/openmc-dev/openmc&quot;&gt;openmc-dev/openmc&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,124&lt;/td&gt;&lt;td&gt;Monte Carlo neutron and photon transport&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Geant4/geant4&quot;&gt;Geant4/geant4&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;865&lt;/td&gt;&lt;td&gt;Passage of particles through matter, from CERN&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;molecular-dynamics-and-electronic-structure&quot;&gt;Molecular dynamics and electronic structure&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/lammps/lammps&quot;&gt;lammps/lammps&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,094&lt;/td&gt;&lt;td&gt;Massively parallel molecular dynamics, from Sandia itself&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/gromacs/gromacs&quot;&gt;gromacs/gromacs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;968&lt;/td&gt;&lt;td&gt;High-performance molecular dynamics; development happens on GitLab&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/QEF/q-e&quot;&gt;QEF/q-e&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;701&lt;/td&gt;&lt;td&gt;Quantum ESPRESSO, electronic structure with DFT; a GitLab mirror&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;computing-infrastructure&quot;&gt;Computing infrastructure&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/kokkos/kokkos&quot;&gt;kokkos/kokkos&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,700&lt;/td&gt;&lt;td&gt;C++ programming model portable across CPU and GPU&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/trilinos/Trilinos&quot;&gt;trilinos/Trilinos&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,438&lt;/td&gt;&lt;td&gt;Linear algebra and solvers, from Sandia&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/AMReX-Codes/amrex&quot;&gt;AMReX-Codes/amrex&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;818&lt;/td&gt;&lt;td&gt;Block-structured mesh refinement, the base of WarpX and Castro&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/AMReX-Astro/Nyx&quot;&gt;AMReX-Astro/Nyx&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;105&lt;/td&gt;&lt;td&gt;Cosmological hydro with N-body, on AMReX&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;visualization-and-analysis&quot;&gt;Visualization and analysis&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Kitware/ParaView&quot;&gt;Kitware/ParaView&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,712&lt;/td&gt;&lt;td&gt;Scientific visualization on VTK, for large simulation data&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/yt-project/yt&quot;&gt;yt-project/yt&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;559&lt;/td&gt;&lt;td&gt;Analysis and visualization of volumetric data in Python&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/visit-dav/visit&quot;&gt;visit-dav/visit&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;534&lt;/td&gt;&lt;td&gt;Visualization of mesh data, from LLNL&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;plasma-and-magnetic-fusion&quot;&gt;Plasma and magnetic fusion&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/PlasmaPy/PlasmaPy&quot;&gt;PlasmaPy/PlasmaPy&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;717&lt;/td&gt;&lt;td&gt;Python package for plasma physics research and teaching&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/freegs-plasma/freegs&quot;&gt;freegs-plasma/freegs&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;145&lt;/td&gt;&lt;td&gt;Free-boundary Grad-Shafranov solver, tokamak equilibrium&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/iterorganization/IMAS-Python&quot;&gt;iterorganization/IMAS-Python&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;73&lt;/td&gt;&lt;td&gt;Python access to the IMAS data model, from ITER&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/iterorganization/SOLPS-ITER&quot;&gt;iterorganization/SOLPS-ITER&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;66&lt;/td&gt;&lt;td&gt;Plasma edge simulation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/tokamak-energy/gsfit&quot;&gt;tokamak-energy/gsfit&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;&lt;td&gt;Grad-Shafranov equilibrium reconstruction in Rust and Python, from Tokamak Energy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/iterorganization/DINA-IMAS&quot;&gt;iterorganization/DINA-IMAS&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14&lt;/td&gt;&lt;td&gt;The DINA plasma simulator&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ITER &lt;a rel=&quot;external&quot; href=&quot;https://www.iter.org/node/20687/release-imas-infrastructure-and-physics-models-open-source&quot;&gt;opened IMAS&lt;/a&gt; on GitHub under open licences; SOLPS-ITER and DINA arrived in November 2025.&lt;/p&gt;
&lt;h3 id=&quot;lists-and-organizations&quot;&gt;Lists and organizations&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Stars&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/paulromano/awesome-nuclear&quot;&gt;paulromano/awesome-nuclear&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;508&lt;/td&gt;&lt;td&gt;Curated list of open software for nuclear science and engineering&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/nikosarcevic/HEP-ASTRO-COSMO&quot;&gt;nikosarcevic/HEP-ASTRO-COSMO&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;157&lt;/td&gt;&lt;td&gt;Packages for high energy physics, astroparticles and cosmology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pmocz/awesome-astrophysical-simulation-codes&quot;&gt;pmocz/awesome-astrophysical-simulation-codes&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;125&lt;/td&gt;&lt;td&gt;List of astrophysical simulation codes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two organizations are worth a full visit: &lt;a rel=&quot;external&quot; href=&quot;https://github.com/fusion-energy&quot;&gt;fusion-energy&lt;/a&gt;, with 45 repositories of fusion software, and the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/UCLA-Plasma-Simulation-Group&quot;&gt;UCLA Plasma Simulation Group&lt;/a&gt;, with QuickPIC, UPIC and teaching codes.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Graph theory: foundations, history and representation</title>
        <published>2016-05-14T00:00:00+00:00</published>
        <updated>2016-05-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            Brenner Cruvinel
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://brennercruvinel.blog/en/blog/teoria-dos-grafos/"/>
        <id>https://brennercruvinel.blog/en/blog/teoria-dos-grafos/</id>
        
        <content type="html" xml:base="https://brennercruvinel.blog/en/blog/teoria-dos-grafos/">&lt;p&gt;I think in graphs in a world that makes me speak in sequence. In 2016 I saved this excerpt from Wikipedia to have the fundamentals at hand. It is curation, not my own text: the source and the licence are at the end.&lt;/p&gt;
&lt;h2 id=&quot;definition&quot;&gt;Definition&lt;/h2&gt;
&lt;p&gt;Graph theory is the branch of mathematics that studies the relationships between the objects of a set. It uses structures called graphs, $G(V, E)$, where $V$ is a non-empty set of objects called vertices (or nodes) and $E$ (edges) is a subset of unordered pairs of $V$.&lt;/p&gt;
&lt;p&gt;Depending on the application, edges may or may not have a direction, an edge may or may not be allowed to connect a vertex to itself, and vertices and edges may have a numerical weight attached. If an edge has a direction, shown by an arrow, we have a digraph, or directed graph. A graph with a single vertex and no edges is the trivial graph.&lt;/p&gt;
&lt;p&gt;Structures that can be represented as graphs are everywhere. Wikipedia&#39;s link structure, for example, is a digraph: the vertices are the articles, and there is an edge from A to B if and only if A contains a link to B. Digraphs also represent finite state machines.&lt;/p&gt;
&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;
&lt;p&gt;Leonhard Euler&#39;s paper on the problem of the seven bridges of Königsberg, from 1736, is considered the first result in graph theory. It is also one of the first topological results in geometry, because it does not depend on measurement, which shows the deep connection between graphs and topology.&lt;/p&gt;
&lt;p&gt;More than a century later, while Listing was introducing the concept of topology, Cayley studied a particular class of graphs, trees, out of interest in analytical forms in differential calculus, with implications for theoretical chemistry. The first textbook on graph theory was written by Dénes König and published in 1936.&lt;/p&gt;
&lt;p&gt;The four colour problem asks whether any map drawn on a plane can have its regions coloured with four colours so that no two regions sharing a border get the same colour. Francis Guthrie formulated the question in 1852, and the first written record is a letter from that year by Augustus De Morgan to William Rowan Hamilton. The proof only came in 1976, from Appel and Haken, and it was one of the first major proofs done with the help of a computer.&lt;/p&gt;
&lt;h2 id=&quot;basic-definitions&quot;&gt;Basic definitions&lt;/h2&gt;
&lt;p&gt;A directed graph (digraph, or &lt;em&gt;quiver&lt;/em&gt;) consists of a non-empty set $V$ of vertices, a set $E$ of edges and maps $s, t : E \to V$, where $s(e)$ is the source and $t(e)$ is the target of the directed edge $e$.&lt;/p&gt;
&lt;p&gt;An undirected graph is given by $V$, $E$ and a function $w : E \to P(V)$ that assigns to each edge a subset of two (or one) elements of $V$, its endpoints.&lt;/p&gt;
&lt;p&gt;In a weighted graph, an additional function $E \to \mathbb{R}$ assigns a cost to each edge. This kind of graph shows up in optimal route problems, like the travelling salesman.&lt;/p&gt;
&lt;p&gt;Example graph: $V = {1, 2, 3, 4, 5, 6}$ and $E = {{1,2}, {1,5}, {2,3}, {2,5}, {3,4}, {4,5}, {4,6}}$. The drawing should not be confused with the graph itself, which is the abstract structure. What matters is which vertex is connected to which, and by how many edges.&lt;/p&gt;
&lt;h2 id=&quot;storing-graphs-in-a-computer&quot;&gt;Storing graphs in a computer&lt;/h2&gt;
&lt;p&gt;There are two families of structure, with the classic trade-off between memory and access speed.&lt;/p&gt;
&lt;p&gt;List structures, good for sparse graphs and light on memory: the adjacency list associates each vertex with the list of vertices it shares an edge with, and the incidence list stores the edges incident to each vertex.&lt;/p&gt;
&lt;p&gt;Matrix structures, with fast access and more memory: the incidence matrix holds zeros and ones, with one row per vertex and one column per edge, and the adjacency matrix has vertices on both rows and columns, with 1 marking adjacency. In computing, a finite graph with $n$ vertices is usually represented by the $n \times n$ adjacency matrix, whose value at row $i$, column $j$, gives the number of edges from the $i$-th to the $j$-th vertex.&lt;/p&gt;
&lt;h2 id=&quot;concepts&quot;&gt;Concepts&lt;/h2&gt;
&lt;p&gt;The valency, or degree, of a vertex is the number of edges incident to it, with a loop counting twice. The handshaking lemma says that the sum of the degrees of all vertices is twice the number of edges:&lt;/p&gt;
&lt;p&gt;$$2m = \sum_{v \in V} \deg(v)$$&lt;/p&gt;
&lt;p&gt;In a digraph, out-degree and in-degree are distinguished.&lt;/p&gt;
&lt;p&gt;A walk between A and B is an alternating list of vertices and edges, and its length is the number of edges, counting repetitions. A path is a sequence of vertices in which each one has an edge to the next. In a simple path, no vertex repeats.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Eulerian path uses each edge exactly once, and an Eulerian cycle does that and closes. Deciding whether one exists is easy: you only need to look at the vertex degrees&lt;/li&gt;
&lt;li&gt;A Hamiltonian path visits each vertex exactly once, and a Hamiltonian cycle does that and closes. Deciding whether one exists is NP-complete&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A cycle, or circuit, is a path that starts and ends at the same vertex. A cycle of length 1 is a loop. A graph is acyclic if it contains no simple cycle.&lt;/p&gt;
&lt;h2 id=&quot;types-of-graph&quot;&gt;Types of graph&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Definition&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Simple&lt;/td&gt;&lt;td&gt;Undirected, no loops, at most one edge between two vertices&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Multigraph&lt;/td&gt;&lt;td&gt;Allows several edges between the same vertices&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pseudograph&lt;/td&gt;&lt;td&gt;Contains parallel edges and loops&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Complete&lt;/td&gt;&lt;td&gt;Every vertex connects to all others; $K_n$ has $n(n-1)/2$ edges&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Null&lt;/td&gt;&lt;td&gt;Empty set of vertices&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Empty&lt;/td&gt;&lt;td&gt;Empty set of edges&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Regular&lt;/td&gt;&lt;td&gt;All vertices have the same degree&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Connected&lt;/td&gt;&lt;td&gt;There is a path from any vertex to any other; it is $k$-connected if this holds after removing $k-1$ vertices&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tree&lt;/td&gt;&lt;td&gt;Simple, acyclic and connected graph; sometimes one vertex is the root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Forest&lt;/td&gt;&lt;td&gt;A set of trees, acyclic&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Planar&lt;/td&gt;&lt;td&gt;Can be drawn on the plane without crossing edges; $K_n$ with $n &amp;gt; 4$ is not planar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Bipartite&lt;/td&gt;&lt;td&gt;Vertices in two sets, with no edge inside the same set; it is bipartite if and only if it contains no odd-length cycle&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Beyond these: subgraph, spanning subgraph, induced subgraph and partial graph; articulation point (a vertex whose removal disconnects the graph) and bridge (an edge with the same effect); clique (a subgraph that is also complete); independent set (vertices not adjacent to each other); complete bipartite graph and $k$-partite graph ($k$-colouring); and the four colour theorem, which says every planar graph can be coloured with four colours.&lt;/p&gt;
&lt;h2 id=&quot;traversal-and-algorithms&quot;&gt;Traversal and algorithms&lt;/h2&gt;
&lt;p&gt;Traversing a graph means systematically visiting all vertices and all edges. The two basic methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;abbr title=&quot;breadth-first search&quot;&gt;BFS&lt;/abbr&gt; uses a queue. It visits nodes starting from the shallowest level and computes the shortest distance, in number of edges, to all reachable vertices. The subgraph of those paths is the &lt;em&gt;breadth-first tree&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;abbr title=&quot;depth-first search&quot;&gt;DFS&lt;/abbr&gt; uses a stack. It expands the first child and goes deeper until it finds the target or a leaf, then backtracks. On wide graphs, it usually uses less memory than BFS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The running time of both is proportional to the number of vertices plus the number of edges.&lt;/p&gt;
&lt;p&gt;Problems and algorithms around this: graph colouring, the four colour theorem, independent set, clique, shortest path, minimum spanning tree, the seven bridges of Königsberg, route inspection (Chinese postman), travelling salesman, maximum flow (Ford-Fulkerson), Dijkstra, Kruskal, nearest neighbour and Prim.&lt;/p&gt;
&lt;h2 id=&quot;generalization&quot;&gt;Generalization&lt;/h2&gt;
&lt;p&gt;In a hypergraph, an edge can connect more than two vertices. An undirected graph can be seen as a simplicial complex, with simplices of dimension one (the edges) and dimension zero (the vertices), and the complex generalizes this to higher dimensions. See also complex network, spectral graph theory, small-world network and the Watts-Strogatz model.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Biggs, N.; Lloyd, E.; Wilson, R. (1986). &lt;em&gt;Graph Theory, 1736-1936&lt;/em&gt;. Oxford University Press.&lt;/li&gt;
&lt;li&gt;Cayley, A. (1857). On the theory of the analytical forms called trees. &lt;em&gt;Philosophical Magazine&lt;/em&gt;, series IV, 13(85), 172-176.&lt;/li&gt;
&lt;li&gt;Tutte, W. T. (2001). &lt;em&gt;Graph Theory&lt;/em&gt;. Cambridge University Press, p. 30.&lt;/li&gt;
&lt;li&gt;West, D. B. (2001). &lt;em&gt;Introduction to Graph Theory&lt;/em&gt;, 2nd ed. Prentice Hall, p. 20.&lt;/li&gt;
&lt;li&gt;Di Battista, G.; Eades, P.; Tamassia, R.; Tollis, I. G. (1994). Algorithms for Drawing Graphs: an Annotated Bibliography. &lt;em&gt;Computational Geometry: Theory and Applications&lt;/em&gt;, 4, 235-282.&lt;/li&gt;
&lt;li&gt;Longabaugh, W. (2012). Combing the hairball with BioFabric. &lt;em&gt;BMC Bioinformatics&lt;/em&gt;, 13, 275.&lt;/li&gt;
&lt;li&gt;Goodrich, M. T.; Tamassia, R. (2001). &lt;em&gt;Estruturas de Dados e Algoritmos em Java&lt;/em&gt;, 2nd ed. Bookman, p. 502-503.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;source-and-licence&quot;&gt;Source and licence&lt;/h2&gt;
&lt;p&gt;Translated and adapted from the article &lt;a rel=&quot;external&quot; href=&quot;https://pt.wikipedia.org/wiki/Teoria_dos_grafos&quot;&gt;Teoria dos grafos&lt;/a&gt; on the Portuguese Wikipedia, checked against the revision of 6 October 2026, under the &lt;a rel=&quot;external&quot; href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC BY-SA 4.0&lt;/a&gt; licence. I adapted the wording, corrected the history of the four colour problem and added the date of the proof. As a derivative work, this text is under the same licence.&lt;/p&gt;
</content>
        
    </entry>
</feed>
