<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Diff & The Merge]]></title><description><![CDATA[The day-to-day life of an open-source maintainer in the Python/data/AI domain.]]></description><link>https://oxykodit.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!T8rX!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8995aadf-3bf2-421a-9d29-17de18947896_153x153.png</url><title>The Diff &amp; The Merge</title><link>https://oxykodit.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 10 Apr 2026 20:53:09 GMT</lastBuildDate><atom:link href="https://oxykodit.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sofie Van Landeghem]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[oxykodit@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[oxykodit@substack.com]]></itunes:email><itunes:name><![CDATA[Sofie]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sofie]]></itunes:author><googleplay:owner><![CDATA[oxykodit@substack.com]]></googleplay:owner><googleplay:email><![CDATA[oxykodit@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sofie]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[March 2026 update]]></title><description><![CDATA[Free-threaded Python support for FastAPI, the ty type checker, analysing loss curves, autoresearch and LLM-readable documentation in skills.md]]></description><link>https://oxykodit.substack.com/p/march-2026-update</link><guid isPermaLink="false">https://oxykodit.substack.com/p/march-2026-update</guid><dc:creator><![CDATA[Sofie]]></dc:creator><pubDate>Mon, 06 Apr 2026 16:48:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xR4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>March has been another busy month on the OSS front. These are the main topics I&#8217;ll cover in this monthly update:</p><ul><li><p>Getting FastAPI ready for free-threaded Python</p></li><li><p>Introducing Astral&#8217;s ty into FastAPI&#8217;s lint checker</p></li><li><p>Analysing loss curves to triage nanochat user contributions</p></li><li><p>Welcoming nanochat&#8217;s little brother &#8216;autoresearch&#8217;</p></li><li><p>Publishing skills files to help LLMs write the best code for frameworks you maintain</p></li></ul><h2>Free-threaded Python</h2><p>Since v3.13, CPython supports building Python in a &#8220;free threaded&#8221; model, which means thath the GIL (global interpreter lock) is disabled. This then paves the way for more efficient execution of Python programs by utilizing all available CPU cores in parallel threads. The Python versions that support free-threading are denoted with a &#8220;t&#8221; at the end, so e.g. 3.13t and 3.14t. </p><p>There&#8217;s been quite a lot of work done in the ecosystem to start supporting these free-threaded Python versions, which isn&#8217;t always trivial. Nathan Goldbaum and other colleagues at Quansight Labs have been working hard to get core packages such as <a href="https://github.com/numpy/numpy/issues/26157">NumPy</a> and <a href="https://github.com/scipy/scipy/pull/23294">scipy</a> to fully support a nogil build of Python. About half a year ago, we started looking into this for FastAPI as well (cf. PR <a href="https://github.com/fastapi/fastapi/pull/13946">13946</a>), but quickly ran into dependencies that weren&#8217;t compatible yet: httptools, pydantic, bcrypt and orjson to name a few. The beauty of open-source: I pinged Nathan (out of the blue) to help assess the situation for FastAPI and not only did he show up in the PR thread with some pointers and advice, he also went on to help <a href="https://github.com/MagicStack/httptools/pull/130">httptools</a> fix their CI and get ready for free-threaded support.</p><p>While the ecosystem was working on this, we put it on the back burner for FastAPI for a few months, until I took it back up this month in <a href="https://github.com/fastapi/fastapi/pull/15149">PR 15149</a>. This time even without asking, Nathan showed up with helpful advice and helped us get <a href="https://github.com/DoctorJohn/fastar/pull/62">fastar</a> ready for nogil &lt;3.</p><p>The final steps then to get FastAPI ready for Python 3.14t, was to remove orjson and ujson as standard test dependencies, which was possible since FastAPI&#8217;s BDFL Sebasti&#225;n Ram&#237;rez (commonly known as <a href="https://github.com/tiangolo">Tiangolo</a>) had deprecated ORJSONResponse and UJSONResponse in favour of using JSON responses that can be serialized with Pydantic (cf. PR <a href="https://github.com/fastapi/fastapi/pull/14962">14962</a>).</p><p>I&#8217;m pretty happy with how this has worked out, and it was super nice to interact with the folks from Quansight Labs. With all of the LLM-slop PRs, reviews and conversations that we&#8217;re dealing with on GitHub lately, it&#8217;s great to interact with actual people who are just super helpful and genuinely care about the ecosystem. Thanks a bunch, Nathan &amp; team! The 3.14t PR isn&#8217;t merged yet - it&#8217;s waiting for a final review by Sebasti&#225;n - but you can expect free-threaded support in FastAPI sometime soon!</p><h2>ty is for types</h2><p>Not only has <a href="https://docs.astral.sh/">Astral</a> taken the Python world by storm with their fast package manager uv, and their linter ruff, but now they&#8217;ve also published a new type checker called <a href="https://docs.astral.sh/ty/">ty</a>. Like its siblings, ofcourse, it&#8217;s implemented in Rust.</p><p>Over at FastAPI, we think types are quite a big deal, and up until now we&#8217;ve been using mypy for our precommit linting needs. Mypy is pretty good and stable, but still suffers from some false positives (notifications that aren&#8217;t errors) and false negatives (errors that aren&#8217;t reported). Running a second tool in parallel might not be a bad idea!</p><p>When we posted about this on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7445800462081105920/">LinkedIn</a>, there were some comments about ty not being ready for production yet. But it&#8217;s important to realize that ty isn&#8217;t being run in production: it&#8217;s a precommit check for a production-ready codebase, and all of its warnings and errors are manually reviewed by us, the maintainers of said codebase, before pushing any code to production. It&#8217;s really just a tool to help us find potential issues in the code base, just like mypy is.</p><p>So, I set out to add ty to the precommit steps in all of fastapi&#8217;s OS libraries: not only FastAPI itself, but also Typer, Asyncer, SQLModel, annotated-doc, markdown-include-variantes, etc etc. You get the idea. I started with <a href="https://github.com/fastapi/typer/pull/1477">Typer</a>, as it&#8217;s my favourite OS repo to work on and a good guinea pig as FastAPI&#8217;s little sibling. Here, I noticed that ty sometimes doesn&#8217;t infer the correct type, and requires additional cast and/or assert statements to help it see the correct type. Alternatively, you can just add an ignore statement to this line that will suppress ty&#8217;s warning/error. We opted for the latter, though this requires some care: don&#8217;t just put &#8220;type: ignore&#8221; when you&#8217;re running mypy in parallel. Because in those cases where mypy doesn&#8217;t see an issue, it will in fact complain that the ignore statement is unnecessary. You can put &#8220;ty: ignore&#8221; instead (mind the two missing letters), so that it become a ty-specific ignore statement and won&#8217;t influence mypy in any way.</p><p>There were a few spots in Typer&#8217;s code base where we were using a try-catch instead of an explicit if-else to check for existence of certain attributes. ty rightfully called this out, and it&#8217;s one of those small improvements we were able to make by integrating ty into the precommit check.</p><p>In <a href="https://github.com/fastapi/asyncer/pull/503">Asyncer</a>, there was a class definition that mypy had issues with, and we had previously decided to annotated with &#8220;type: ignore&#8221; to suppress mypy&#8217;s warning. Now ty comes along, and decides there is actually no issue with this line. For ty versions 0.0.24 and before, this would mean that you&#8217;d have to add a second ignore statement and the line becomes something like this:</p><blockquote><p><code>class X(Y):  # type: ignore  # ty: ignore[unused-ignore-comment]</code></p></blockquote><p>Which is not super satisfying. However from <a href="https://github.com/astral-sh/ty/releases/tag/0.0.25">ty 0.0.25</a> onwards, ty can actually parse the error codes within a &#8220;type:ignore&#8221; statement, something it couldn&#8217;t before (cf. <a href="https://github.com/astral-sh/ruff/pull/24096">PR 24096</a>). This means that if you put the exact mypy code within brackets, ty will parse it, decide it&#8217;s not one of its known codes, and ignore it. So when <a href="https://github.com/fastapi/asyncer/pull/521">updating</a> ty to 0.0.25 or above, the ugly line quoted above becomes something like</p><blockquote><p><code>class X(Y):  # type: ignore[valid-type]</code></p></blockquote><p>Which is much better. In general, if you prefer to run ty in parallel with any other type checker, I&#8217;d definitely recommend using 0.0.25 and above. </p><p>Continuing with our other repos, many actually required zero code updates after adding ty to the precommit step, which is nice (e.g. <a href="https://github.com/fastapi/fastapi-new/pull/51">fastapi-new</a>, <a href="https://github.com/fastapi/fastapi-cli/pull/335">fastapi-cli</a>, <a href="https://github.com/fastapi/annotated-doc/pull/43">annotated-doc</a>, <a href="https://github.com/tiangolo/markdown-include-variants/pull/58">markdown-include-variants</a>). However, when running ty on <a href="https://github.com/fastapi/fastapi/pull/15091">FastAPI</a>&#8217;s code base for the first time, no less than 150 issues popped up. Some of these were actually pretty useful, for instance pointing to Pydantic v2 deprecations that FastAPI should have addressed earlier but didn&#8217;t because our CI tests for the lower ranges of our dependencies were broken (this is the type of rabbit hole you often find yourself in when open-source-maintaining). So we <a href="https://github.com/fastapi/fastapi/pull/15139">fixed</a> the CI first (with some helpful digging by Yurii Motov), and then <a href="https://github.com/fastapi/fastapi/pull/15101">addressed</a> the deprecations properly. This is a clear case where ty helped us identify issues that hadn&#8217;t been reported by mypy. But the same is also true in reverse: mypy sometimes finds issues that ty doesn&#8217;t. So for now we&#8217;re happy running both in parallel. And yes - thanks for asking - I did manage to resolve all 150 issues, with help from Yurii who gave super detailed and constructive feedback on the PR. Team work makes the dream work ;-)</p><p>Eventually we also decided to mark ty warnings as errors that would fail the CI. This is easily achieved by setting this in your pyproject.toml:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AU1a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AU1a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 424w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 848w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 1272w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AU1a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png" width="271" height="76.14876033057851" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/908722c1-1141-4428-9cf3-d6b738858f25_363x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:363,&quot;resizeWidth&quot;:271,&quot;bytes&quot;:7012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/193342881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AU1a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 424w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 848w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 1272w, https://substackcdn.com/image/fetch/$s_!AU1a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908722c1-1141-4428-9cf3-d6b738858f25_363x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>Loss curves going down, down, down</h2><p>As you may remember from previous posts, I&#8217;ve been involved in the maintenance of Andrej Karpathy&#8217;s <a href="https://github.com/karpathy/nanochat">nanochat</a> repo, which provides all code for training and fine-tuning an LLM. In February, Andrej had set up a <a href="https://github.com/karpathy/nanochat?tab=readme-ov-file#time-to-gpt-2-leaderboard">leaderboard</a> to help incentivize improvements to the pretraining stage of nanochat. Comparing performance using the CORE score, the aim is to get to GPT2-level capabilities in as little as time as possible, measured on a 8xH100. Ideally, also val_bpb should go down, which is a sort of normalized, vocab-size-invariant loss score.</p><p>So one thing I&#8217;ve been doing to help assess user contributions that aim to improve nanochat&#8217;s pretraining code, is to do a quick sanity check on a (single) A100 instance I have access to. Using <a href="https://wandb.ai">W&amp;B</a>, which is awesome for creating graphs you can spend all day looking at, I can then easily plot &amp; compare different PR contributions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xR4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xR4t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 424w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 848w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 1272w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xR4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png" width="530" height="246.43543956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:1456,&quot;resizeWidth&quot;:530,&quot;bytes&quot;:329227,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/193342881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xR4t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 424w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 848w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 1272w, https://substackcdn.com/image/fetch/$s_!xR4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b927a18-45a3-49c9-8581-4a6e3d6784e2_2908x1352.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Woar!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Woar!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 424w, https://substackcdn.com/image/fetch/$s_!Woar!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 848w, https://substackcdn.com/image/fetch/$s_!Woar!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!Woar!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Woar!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png" width="526" height="249.9945054945055" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/680474d6-4867-431c-9693-7590a0d16913_2894x1376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:692,&quot;width&quot;:1456,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:253384,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/193342881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Woar!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 424w, https://substackcdn.com/image/fetch/$s_!Woar!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 848w, https://substackcdn.com/image/fetch/$s_!Woar!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!Woar!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F680474d6-4867-431c-9693-7590a0d16913_2894x1376.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These are all d14 runs on an A100, and in terms of val_bpb, master still comes out on top at the end.</p><p>There&#8217;s many other interesting plots to look at, and all of these graphs are created automatically for you when you run the nanochat training scripts and are logged into W&amp;B. For instance, it&#8217;s also really useful to check memory usage or disk utilization stats:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bixi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bixi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 424w, https://substackcdn.com/image/fetch/$s_!bixi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 848w, https://substackcdn.com/image/fetch/$s_!bixi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 1272w, https://substackcdn.com/image/fetch/$s_!bixi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bixi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png" width="520" height="241.07142857142858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1456,&quot;resizeWidth&quot;:520,&quot;bytes&quot;:192216,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/193342881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bixi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 424w, https://substackcdn.com/image/fetch/$s_!bixi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 848w, https://substackcdn.com/image/fetch/$s_!bixi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 1272w, https://substackcdn.com/image/fetch/$s_!bixi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4dde55-2727-4ead-ab99-d53123c69e14_2901x1345.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uQ5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uQ5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 424w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 848w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 1272w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uQ5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png" width="518" height="242.6346153846154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:1456,&quot;resizeWidth&quot;:518,&quot;bytes&quot;:138203,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/193342881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uQ5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 424w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 848w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 1272w, https://substackcdn.com/image/fetch/$s_!uQ5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddef0a8d-9e73-4b57-89ce-61b1a4be8507_2898x1358.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These plots are also useful to monitor your training run after having made code adjustements: you&#8217;ll typically be able to spot it relatively quickly if something is going fundamentally wrong with the loss profile. Then you don&#8217;t have to wait until the training run ends to go back in and correct things, saving you some valuable cloud credits&#8230;</p><h2>Autoresearch: fine-tuning LLMs with LLMs</h2><p>Meanwhile, Andrej himself was also experimenting with ways to further improve the pretraining step in nanochat, and push the limits of the leaderboard further. Eventually he decided to outsource his LLM engineering research to &#8230; an LLM. I&#8217;ve written a bit more about this, including an experiment with multiple agents riffing off eachother&#8217;s contributions in this post about autoresearch / autolab: </p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e7ccce12-8005-49f8-bd73-dc1e8957c6cc&quot;,&quot;caption&quot;:&quot;Andrej Karpathy&#8217;s autoresearch repo was published just last week, and blew up on Twitter over the weekend. It&#8217;s basically a simplified, single-GPU implementation of nanochat, the open-source LLM-from-scratch repo I help to maintain as &#8220;repo czar&#8221;. But autoresearch isn&#8217;t a static repo: in fact it allows AI agents to try and improve on the core LLM traini&#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deploying an agent swarm to improve LLM training code&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:257280686,&quot;name&quot;:&quot;Sofie&quot;,&quot;bio&quot;:&quot;I write about the day-to-day life of being an open-source maintainer in the Python/data/AI domain. I currently help maintaining FastAPI, Typer, nanochat, autoresearch, and several other adjacent repos. All opinions are my own.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8995aadf-3bf2-421a-9d29-17de18947896_153x153.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-14T20:20:03.773Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2804aa3-955d-4b74-bcbe-c549b25911cb_1080x950.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://oxykodit.substack.com/p/deploying-an-agent-swarm-to-improve&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:190960121,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:8289017,&quot;publication_name&quot;:&quot;The Diff &amp; The Merge&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!T8rX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8995aadf-3bf2-421a-9d29-17de18947896_153x153.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Publishing skills files for your repo</h2><p>Who better to explain to agents how to write code for a certain framework, than the maintainers of said framework? This is actually a pretty cool exercise to do, a bit like writing documentation but for LLMs, not for humans. Sebasti&#225;n had pioneered this idea in <a href="https://github.com/fastapi/fastapi/pull/14982">FastAPI</a>, and I&#8217;ve written a similar one for <a href="https://github.com/fastapi/typer/pull/1620">Typer</a>. What I find particularly promising with this approach is that you can tell LLMs how to navigate recent deprecations or breaking changes in your framework. You can show it best practices and even explain why, so in turn the LLM can review or write code for its human and explain the thought processes behind the change. Would love to get some feedback from the community whether it&#8217;s been helpful to them and how!</p><p>-Sofie</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oxykodit.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Diff &amp; The Merge! Subscribe for free to receive new posts:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Deploying an agent swarm to improve LLM training code]]></title><description><![CDATA[What could go wrong?]]></description><link>https://oxykodit.substack.com/p/deploying-an-agent-swarm-to-improve</link><guid isPermaLink="false">https://oxykodit.substack.com/p/deploying-an-agent-swarm-to-improve</guid><dc:creator><![CDATA[Sofie]]></dc:creator><pubDate>Sat, 14 Mar 2026 20:20:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d2804aa3-955d-4b74-bcbe-c549b25911cb_1080x950.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Andrej Karpathy&#8217;s <a href="https://github.com/karpathy/autoresearch/">autoresearch</a> repo was published just last week, and blew up on Twitter over the weekend. It&#8217;s basically a simplified, single-GPU implementation of <a href="https://github.com/karpathy/nanochat">nanochat</a>, the open-source LLM-from-scratch repo I help to maintain as &#8220;repo czar&#8221;. But autoresearch isn&#8217;t a static repo: in fact it allows AI agents to try and improve on the core LLM training code automatically. We&#8217;re not quite yet talking about self-improvement here, as you&#8217;d have Claude or Codex trying to improve on a relatively small &amp; simple LLM that has GPT-2 capabilities at best. But still, you get the idea, and you can see why Twitter blew up over it.</p><p>And now, there&#8217;s autolab! Now, agents that have been able to improve on the val_bpb score (validation bits per byte -  lower is better), can contribute their &#8220;patch&#8221; to a set of 8 official workers, run by Karpathy, who will go and validate the contribution. When it&#8217;s a genuine improvement over the current record, this patch contribution becomes the new master. All other agents continuously check whether there&#8217;s a new master, and update internally when that&#8217;s the case, so they can keep working off of eachother&#8217;s improvements. And then you get something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4pgu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4pgu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 424w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 848w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 1272w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4pgu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png" width="510" height="545.3777472527472" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1557,&quot;width&quot;:1456,&quot;resizeWidth&quot;:510,&quot;bytes&quot;:295070,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190960121?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4pgu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 424w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 848w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 1272w, https://substackcdn.com/image/fetch/$s_!4pgu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe2ff65-516f-4db2-ba4f-cddd309ea39d_1527x1633.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each dot on this graph represents a contributed patch by an autonomous agent, a patch that was verified by the official workers and resulted in a new master with a better val_bpb score. Basically it gets more difficult to establish a new record as time goes on, and it&#8217;ll be interesting to see whether the agents will change strategy over time as well.</p><h2>Agent OxyKodit joins the swarm</h2><p>I couldn&#8217;t help myself and decided to spin up an H100, which is currently required to join the swarm. It&#8217;s actually super simple: after installing &amp; authenticating Claude Code, you just paste the full agent instructions from autoresearchhub.com (currently offline as this was just a quick experiment), and the agent starts churning. It installs everything, contacts the swarm online to get the latest state of master, then decides on some experiment to run. After making some edits to <code>train.py</code>, it trains a small GPT language model for a fixed 5-minute wall clock budget. If it ends up beating master&#8217;s val_bpb, it will submit this patch and hope to end up on the leaderboard.</p><p>So for instance, this was early on in my run:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u8VA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u8VA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 424w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 848w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 1272w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u8VA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png" width="1456" height="167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:167,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47951,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190960121?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u8VA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 424w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 848w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 1272w, https://substackcdn.com/image/fetch/$s_!u8VA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20471bbc-4d0e-4b09-a525-2ddd586e501d_2013x231.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>It decided that the experiment it did (using SwiGLU instead of squared ReLU) wasn&#8217;t an improvement. Then it also saw that master was updated in the meantime, and made sure to fetch the latest.</p><p>Then at some point it actually did find an improvement, at least when run locally, and it submitted the patch with a pretty verbose explanation. On autolab&#8217;s UI, you could see it being in the queue, waiting for validation:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vmba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vmba!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 424w, https://substackcdn.com/image/fetch/$s_!vmba!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 848w, https://substackcdn.com/image/fetch/$s_!vmba!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 1272w, https://substackcdn.com/image/fetch/$s_!vmba!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vmba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png" width="1456" height="479" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:479,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95217,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190960121?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vmba!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 424w, https://substackcdn.com/image/fetch/$s_!vmba!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 848w, https://substackcdn.com/image/fetch/$s_!vmba!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 1272w, https://substackcdn.com/image/fetch/$s_!vmba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e49fa35-8fa9-4ca9-824c-6577457bd0c0_1828x602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As another agent (&#8220;scientist&#8221;) was running at the same time, you can see that there are multiple submissions already queued or assigned for verification, which means that your submission may still fail to obtain SOTA (state-of-the-art) if another agent beat you to it with a better score. That&#8217;s unfortunately what happened to my first submission, but that&#8217;s OK - our agent relentlessly continues (as long as you pay for tokens). </p><p>In its first 2 hours of existence, Agent OxyKodit was able to make a few more patch submissions when finding local improvements, but hasn&#8217;t yet been able to make it to the &#8220;Path to SOTA&#8221; quite yet. Still, it&#8217;s nice to see its efforts reflected on the leaderboard:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R_cZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R_cZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 424w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 848w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 1272w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R_cZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png" width="352" height="290.37388724035605" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:556,&quot;width&quot;:674,&quot;resizeWidth&quot;:352,&quot;bytes&quot;:48767,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190960121?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R_cZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 424w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 848w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 1272w, https://substackcdn.com/image/fetch/$s_!R_cZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04c9bf4d-a81d-4c17-8dbb-b5114c31de41_674x556.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And in the background, on the console of this H100, the search continues &#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GJIu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GJIu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 424w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 848w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 1272w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GJIu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png" width="576" height="196.608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:1125,&quot;resizeWidth&quot;:576,&quot;bytes&quot;:75802,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190960121?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GJIu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 424w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 848w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 1272w, https://substackcdn.com/image/fetch/$s_!GJIu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a3ae64-d17f-47c2-ade6-52907f02ea3d_1125x384.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>-Sofie</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oxykodit.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Diff &amp; The Merge! Subscribe for free to receive new posts:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to get the most out of your open-source contributions?]]></title><description><![CDATA[Tip & tricks for the contributor and the reviewer]]></description><link>https://oxykodit.substack.com/p/how-to-get-the-most-out-of-your-open</link><guid isPermaLink="false">https://oxykodit.substack.com/p/how-to-get-the-most-out-of-your-open</guid><dc:creator><![CDATA[Sofie]]></dc:creator><pubDate>Wed, 11 Mar 2026 22:30:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e3c7472a-6832-4626-b404-e61657292137_1468x291.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O9Np!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O9Np!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 424w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 848w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 1272w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O9Np!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png" width="1456" height="289" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:289,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30226,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190670637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O9Np!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 424w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 848w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 1272w, https://substackcdn.com/image/fetch/$s_!O9Np!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f7b9a9-dd1a-495f-873b-2fe1756bb01e_1468x291.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>After more than 10 years of contributing open-source (OS) code on Github, I&#8217;d love to share some tips &amp; tricks from my own personal experience - both as a contributor and as a reviewer. </p><h3>What do effective Pull Requests look like?</h3><p>Let&#8217;s first dive into the <em><strong>contributor&#8217;s perspective</strong></em>. You&#8217;ve spent days, maybe weeks, to implement a new feature or hunt a bug, and you&#8217;re finally close to wrapping this up. You&#8217;re proud of the work and effort you put in (and rightfully so!), and you&#8217;d like your contribution to be merged into the &#8216;main&#8217; branch as soon as possible. You wrap things up by quickly creating a PR contributing all the code from your branch, write one or two lines in the PR message body, and call it a day. You&#8217;re looking forward to all the positive feedback on your hard work in the morning!</p><h4>How to showcase the value of your work clearly?</h4><p>Unfortunately, one of these things might happen instead: your PR sits around and doesn&#8217;t get a review. Or it does get a review, and it&#8217;s endless questions and comments. You&#8217;re getting slightly annoyed or even disappointed. Can&#8217;t they see the clear value of this work and just merge it in? </p><p>Turn this around and ask yourself: what could I have done to make the value of my work more clear? To convince the reviewers of the correctness? </p><p>Here&#8217;s a helpful shortlist to give your PR a flying start the next time around:</p><ul><li><p>Ensure your code is <em>formatted</em><strong> </strong>according to the project&#8217;s guidelines. This instills trust that you&#8217;re paying attention to details.</p></li><li><p>If it&#8217;s a bug fix: contribute a clear, concise<em> unit test</em> that fails on &#8216;main&#8217; but succeeds on your branch.</p></li><li><p>If it&#8217;s a new feature: provide <em>sample code</em> that demonstrates the functionality. This will incite enthousiasm and make the value of your work crystal clear and tangible.</p></li><li><p>Update all <em>documentation</em><strong> </strong>relevant to the changed functionality. You might be inclined to do this &#8220;after review&#8221; or even &#8220;after approval&#8221;, but in most cases that&#8217;s a mistake. Writing the documentation will help you think about the general API design and whether it&#8217;s consistent with your current code &amp; functionality. Furthermore, it will help reviewers better understand the implications of your PR. Eventually, this will help speed up the approval process.</p></li><li><p>In the PR description, write a clear <em>summary</em><strong> </strong>of the proposed changes and indicate any potential issues with backwards-compatibility.</p></li><li><p>Make it clear whether or not you&#8217;ve used <em>AI</em> to generate any of the code, whether you&#8217;ve reviewed it all, and which parts you may not understand yourself. Honesty builds trust!</p></li></ul><h4>Focus on one unit of work per PR</h4><p>Think about what constitutes <em><strong>one unit of work</strong></em> and address only one problem/feature in one PR. Did you run into a vaguely related bug X while implementing a new feature Y? Submit the bug fix X to &#8216;main&#8217; with a clear unit test and submit the PR for feature Y independently. Having more &#8216;atomic&#8217; PRs has many advantages:</p><ul><li><p>Reviewers can focus on one thing at a time</p></li><li><p>Small fixes get merged &amp; released more quickly: a bug fix can go into the next patch release, while a major feature/refactor may have to wait for the next minor or major release</p></li><li><p>If you ever need to revert a feature PR because of unexpected issues, you don&#8217;t end up accidentally reverting a good fix as well</p></li><li><p>You might have a few merge conflicts, but they&#8217;ll be smaller &amp; easier to deal with if you keep the functionality of each PR minimal</p></li></ul><h4>Be your own PR&#8217;s first reviewer</h4><p>Once you&#8217;ve done all the above: be your own PR&#8217;s first reviewer. What does this mean exactly?</p><p>Submit the PR as draft, step out of &#8220;developer mode&#8221; and into &#8220;review mode&#8221;, and <em><strong>inspect your own code changes</strong></em> with a healthy dose of criticism &amp; sceptism. This is especially critical if you&#8217;ve used AI to (help) write the code. </p><p>Is the PR description up-to-date? Does it provide enough context for someone else to follow your reasoning? Are all the changes in fact related to one core functionality? Are there any debug comments or print statements still lingering? Did you write unit tests for everything? Does the CI run succesfully, are there no merge conflicts? Does the example code run correctly? What if you change the input slightly, do you get appropriate error messages? Can you make the code more robust &amp; user-friendly? Is the code easy to read and maintain?</p><p>And one of the most important tips: <em><strong>write review comments</strong></em> (on your own PR!) for things you're uncertain about, important design choices or non-obvious implementations you require feedback on. This will help reviewers zoom in on the important stuff. It might be tempting to think "hey maybe they won't notice this weird approach I took at L342", but you're not doing anyone a favour: a reviewer might flag it and become less confident in the remainder of the PR, or they might not flag it, which could be worse: the code gets merged into 'main' and you'll be explaining this odd code block when a bug report hits your issue tracker 2 months from now. Overall, and somewhat counter intuitively, admitting that you're uncertain about something actually helps build confidence in you and your contributions overall. It sets the stage for open communication, positive feedback and constructive collaboration.</p><h3>Any tips for the reviewer?</h3><p>Switching perspective - let&#8217;s now consider <em><strong>how a reviewer can be as effective and helpful as possible</strong></em>. Do consider that not all review(er)s are equal: some will just write a quick nit-pick comment, others may spend 2 hours going through all the code. Either way: explain clearly what you&#8217;ve done and where you&#8217;re at. Useful context to give, for instance, could be:</p><ul><li><p>&#8220;<em>Just a quick drive-by comment, didn&#8217;t review everything</em>&#8221;</p></li><li><p>&#8220;<em>I looked at the PR in detail, and only had a few minor comments&#8221;</em></p></li><li><p>&#8220;<em>Started reviewing, but I need you to address point X before I can continue&#8221;</em></p></li></ul><p>Giving this context beyond just the bare comments, helps other reviewers as well as the original contributor to better understand the state of the PR, what is needed to push it along, and who should do what. And while you're at it, say something nice and positive as well. Even when you're unhappy with the implementation but understand the motivation for the feature, you can say so: "<em>this would be a great feature to have</em>". At least, acknowledge the work and effort the contributor has put in, as a bunch of critical comments may otherwise come across as very demotivating. Of course, reviewing is also hard work, requires context switches, and you're only doing this to help and/or that's just your job. But nevertheless, I've found it pleasant to work with collaborators who uphold a <em><strong>positive and constructive attitude</strong></em>, even if they have plenty of comments or criticism.</p><p>The same principle about open and clear communication for the submitter is true for the reviewer as well: if you're uncertain about certain parts of the code, simply say so. Perhaps find someone else to do an additional review, or decide to lean on the contributor's expertise. In general, make it <em><strong>clear what the next steps should be</strong></em> for this PR to move along. Avoid getting trapped in the "bystander effect", where e.g. 3 people are requested for review and they all wait for someone else to do it. Avoid relying on implicit expectations such as "I thought you were still working on this" or "I thought X was still reviewing" - clarify if need be and make expectations explicit.</p><h3>PRs do not necessarily follow a linear path</h3><p>And finally, understand that work on PRs, like any other dev work, is not always a linear process. Sometimes you&#8217;ll need to go back and revisit earlier decisions, or ultimately decide on a different design that requires some refactoring. That&#8217;s not a problem in itself, as long as you&#8217;re converging to a final solution and not endlessly debating / refactoring. It&#8217;s still better to do one more round of changes before merging, than having to do it in subsequent releases and impacting users. Realise that you&#8217;re all working towards the same goal of improving the code and functionality so that it&#8217;s ultimately as useful as possible for the users of the software. And in the process, view every PR as an opportunity to learn from other developers and further improve your coding skills, whether you&#8217;re the original contributor or the reviewer.</p><p>Happy OSS&#8217;ing!</p><p>-Sofie</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oxykodit.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Diff &amp; The Merge! Subscribe for free to receive new posts:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[January 2026 update]]></title><description><![CDATA[Typer reference docs, uv and nanochat progress]]></description><link>https://oxykodit.substack.com/p/january-2026-update</link><guid isPermaLink="false">https://oxykodit.substack.com/p/january-2026-update</guid><dc:creator><![CDATA[Sofie]]></dc:creator><pubDate>Sun, 01 Feb 2026 21:47:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/12e30b3c-34d1-471c-bd86-92a93f4d8186_1550x987.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In January, my OSS maintenance time was pretty much divided between FastAPI, Typer and friends on the one hand, and nanochat on the other hand. In this monthly update, I&#8217;ll talk about:</p><ul><li><p>Writing reference docs for Typer (finally!)</p></li><li><p>Guiding users to use uv instead of poetry</p></li><li><p>Reviewing nanochat progress</p></li></ul><h2>Typer reference docs</h2><p>Sebasti&#225;n Ram&#237;rez, or <a href="https://github.com/tiangolo/">Tiangolo</a> as he&#8217;s known on GitHub, is not only famous for the awesome developer-friendly open-source tools he creates, but also for the extremely extensive and beginner-friendly documentation that he always writes. As an example, the <a href="https://fastapi.tiangolo.com/">docs</a> for FastAPI give you an introduction on Python types and explain concurrency and environment variables, before kicking off with a &#8220;First Steps&#8221; introduction to FastAPI. The tutorial continues to build complexity and provides detailed code examples along the way.</p><p>For Typer, a very similar philosophy was taken when writing the documentation, and users are generally very happy with the high quality of available information. However at some point, when you&#8217;re a seasoned developer already familiar with FastAPI and/or Typer, you don&#8217;t want to go scrolling through pages &amp; pages of verbose text to find a particular setting or default value.</p><p>Enter reference docs: a concise overview of the relevant methods, parameters &amp; defaults, and how they can be used. While we already had <a href="https://fastapi.tiangolo.com/reference/">one</a> for FastAPI, it took me until now to write this up for Typer, too. <a href="https://github.com/fastapi/typer/pull/1504">PR 1504</a> shows how we approach this: rather than writing these reference docs from scratch, we basically add Doc() annotations within Annotated[] definitions for the parameters of important functions - right in the code itself.<br><br>So for instance this</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5XG-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5XG-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 424w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 848w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 1272w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5XG-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png" width="365" height="29.61199294532628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:46,&quot;width&quot;:567,&quot;resizeWidth&quot;:365,&quot;bytes&quot;:7737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190966198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5XG-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 424w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 848w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 1272w, https://substackcdn.com/image/fetch/$s_!5XG-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a824bf1-a70c-4e93-8ca8-467580f7095d_567x46.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>would now become </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!38Y8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!38Y8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 424w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 848w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 1272w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!38Y8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png" width="1456" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67591,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190966198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!38Y8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 424w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 848w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 1272w, https://substackcdn.com/image/fetch/$s_!38Y8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61ab5fd2-26c9-4b97-8f54-34e56fe70219_1504x766.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And that will render on the reference docs like so:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r54P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r54P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 424w, https://substackcdn.com/image/fetch/$s_!r54P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 848w, https://substackcdn.com/image/fetch/$s_!r54P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 1272w, https://substackcdn.com/image/fetch/$s_!r54P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r54P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59361,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oxykodit.substack.com/i/190966198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r54P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 424w, https://substackcdn.com/image/fetch/$s_!r54P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 848w, https://substackcdn.com/image/fetch/$s_!r54P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 1272w, https://substackcdn.com/image/fetch/$s_!r54P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51a80cc-a9c4-40ba-aa9b-6a90c5965990_1475x481.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(kudos to Yurii Motov for improving the layout in <a href="https://github.com/fastapi/typer/pull/1630">PR 1630</a> !)</p><p>Anyway while we hope this will be useful for all Typer developers out there, it was actually also fun to write, because it kind of made me stop and think about every single functionality that Typer offers.</p><h2>uv instead of poetry</h2><p>uv has pretty much taken the land of Python by storm. Built by <a href="https://astral.sh/">Astral</a>, the same team behind ruff, uv is written in Rust and meant to be an extremely fast Python package and project manager, which it is. Pretty much everyone I know has switched to using uv instead of pip, but for the &#8220;Building a package&#8221; tutorial in Typer we were still referencing poetry. Rectified that since <a href="https://github.com/fastapi/typer/pull/1474">PR 1474</a> !</p><p>It&#8217;s the kind of change where you carefully have to read all the documentation surrounding the edits, to see whether there are any spurious remarks still referencing the old documentation. For instance, the package structure will look slightly different on file with uv instead of with poetry, so all of that needs to be updated too. What I think would be boring work to many, is something I actually quite enjoy doing, being meticulous and ensuring consistency across documentation, to ensure there&#8217;s as little friction for first-time users as possible. And ofcourse, ask your favourite LLM to double check everything to make sure you haven&#8217;t forgotten any references!</p><h2>nanochat reviewing</h2><p>In December, things were relatively quiet on the <a href="https://github.com/karpathy/nanochat">nanochat</a> front, the open-source repo by Andrej Karpathy that provides you all the code for training and fine-tuning an LLM, even providing scripts to chat with it on a web or CLI interface. But in January a few major refactors happened:</p><ul><li><p>The inline rustbpe was <a href="https://github.com/karpathy/nanochat/commit/aa42f40e66ecb62c5649f57a6123c04977f44622">deleted</a> and moved to a separate <a href="https://github.com/karpathy/rustbpe">repo</a></p></li><li><p>The configurator was <a href="https://github.com/karpathy/nanochat/commit/eb7bbc1b66c750f3a2a78d5c7dd38adc79753e95">nuked</a> in favor of argparse</p></li><li><p>The <a href="https://github.com/karpathy/nanochat/blob/master/scripts/base_train.py">base_train</a> script was improved both in code layout as well as hyper-parameter tuned</p></li><li><p>Muon optimizer <a href="https://github.com/karpathy/nanochat/commit/2c4473dd1b608a403700b098f867b202c2a03522">changes</a> resulting in a bump of val_bpb</p></li><li><p>Integration of <a href="https://github.com/karpathy/nanochat/commit/2ff7d512528a6f50886e47f1e86c995d352ab2c9">Flash Attention 3</a></p></li><li><p>&#8230;</p></li></ul><p>While I had nothing to do with any of these improvements, as &#8220;repo czar&#8221; I&#8217;ve tried to be helpful by updating older PRs that had accumulated merge conflicts, closing PRs that were no longer relevant, and making sure that everything remained consistent (e.g. <a href="https://github.com/karpathy/nanochat/pull/407">PR 407</a>, <a href="https://github.com/karpathy/nanochat/pull/416">PR 416</a>, <a href="https://github.com/karpathy/nanochat/pull/438">PR 438</a>).</p><p>It&#8217;s really a lot of fun to have a &#8220;front row seat&#8221; watching this repo evolve and get better every day!</p><p>-Sofie</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oxykodit.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Diff &amp; The Merge! Subscribe for free to receive new posts:</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>