<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.1">Jekyll</generator><link href="https://uwekorn.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://uwekorn.com/" rel="alternate" type="text/html" /><updated>2026-02-05T09:55:49+00:00</updated><id>https://uwekorn.com/feed.xml</id><title type="html">Uwe’s Blog</title><subtitle>**Uwe L. Korn**, Data Scientist, Music Hacker and Food lover.
</subtitle><entry><title type="html">Should I write that AI coding strategy post?</title><link href="https://uwekorn.com/2026/02/05/should-i-write-that-ai-coding-strategy-post.html" rel="alternate" type="text/html" title="Should I write that AI coding strategy post?" /><published>2026-02-05T00:00:00+00:00</published><updated>2026-02-05T00:00:00+00:00</updated><id>https://uwekorn.com/2026/02/05/should-i-write-that-ai-coding-strategy-post</id><content type="html" xml:base="https://uwekorn.com/2026/02/05/should-i-write-that-ai-coding-strategy-post.html">&lt;p&gt;In the last two months, I wanted to get people to experiment more with agentic coding tools.
While I have seen successful uses of them, some people still weren’t using them at all,
and others stuck with one tool (mostly GitHub Copilot) and assumed that all other tools were similar.
Given the changes we are currently observing in the software engineering space, the level of experimentation I was seeing at our company was lower than I would have expected.
Still, there is a large crowd trying out everything, experimenting with new techniques and constantly seeking access to new tools.
These should be the ones I want to encourage to keep doing it and help them remove any blockers along the way.&lt;/p&gt;

&lt;h2 id=&quot;why-should-i-write-such-a-post&quot;&gt;Why should I write such a post?&lt;/h2&gt;

&lt;p&gt;Among other actions, I wanted to write a call-to-action blog post to encourage and streamline our efforts to adopt AI-based (agentic) coding tools.
The post should not be as strong as &lt;a href=&quot;https://fortune.com/2025/08/25/coinbase-ceo-brian-armstrong-ai-coding-assistants-mandate-tech/&quot;&gt;the one from Brian Armstrong&lt;/a&gt;, but rather a soft version of &lt;a href=&quot;https://x.com/tobi/status/1909251946235437514&quot;&gt;Tobi Lütke’s post&lt;/a&gt;.
The plan is not to reshape/reorganise the company with AI, but rather to guide it toward a sane adoption of AI coding.&lt;/p&gt;

&lt;p&gt;Before writing the post, I had to decide whether I should do this in the first place.
I wanted to include some context on the current state, discuss open questions, outline what we are going to do, and include a call to action at the end.
This will turn into a lengthy post, and, from experience, the longer a post is, the less likely people are to read it in full.
Still, this marks a significant shift in how we (will) work, and I was encouraged by several people to address this and ensure we move at the same pace as the leaders in the field.
In addition to the length, the content can simply lead to some backlash.
We are in an experimental phase and have not found the right way to do things.
This means that it is pretty easy to be criticised for pushing immature practices.
In the end, this is something I considered a necessary evil, as I want to push people to look into agentic coding that they are not doing as actively as I wish.&lt;/p&gt;

&lt;h2 id=&quot;how-to-start&quot;&gt;How to start?&lt;/h2&gt;

&lt;p&gt;Once I had committed to writing the post, I needed to decide what it would contain.
As I wanted the whole company to be able to read it (80%+ of my colleagues write code), it needed a sufficient introduction to the topic.
To start, I used Karpathy’s post from 26th Dec (you need to look it up, I don’t link to that site anymore) as an introduction.
This already summarises the madness of choices/possibilities/… a programmer currently has to go through if they want to write code.
In addition, I felt the urge to clarify that producing code is only a subset of the work a software engineer does.
My gut feeling is that once you leave the group of people writing software, people assume a software engineer’s sole task is coding.
The other elephant in the room I wanted to touch on in the introduction was the people calling for a “wait-and-see” approach, where we lean back and look again in several months/years’ time on what people converged on.
While this would save us a lot on experimentation, it would also mean we would not be able to leverage the benefits for very long.&lt;/p&gt;

&lt;p&gt;With the context set, I moved on to the company specifics.
This picked up conversations from Slack and also referenced Notion pages listing the tools we have available and those we are actively experimenting with.
This should directly allow people to take action and try out things that they may not have been aware of.
To emphasise that we are going through a significant change, I then outline the new patterns of software development we are seeing.
While you shouldn’t “vibe code” everything from now on, it is important to understand that you can successfully use it for things that you may not have thought of before.
If you have the right guardrails and checks in place, you should be able to create settings/situations where you can run the code blindly.
Still, there is a psychological component to it.
We are used to inspecting the code to ensure it does what we intend, rather than checking it from the outside.
In some cases, we need to unlearn it, whereas in others, we should definitely review and fully own it.
This part is important for me to get right.
I don’t want to argue that everything should be vibe-coded, but I do want to encourage people to try new possibilities where you wouldn’t have coded something at all in the past.
In contrast, anything that could be considered production or critical code should be carefully reviewed using the four-eyes principle and owned by the person submitting it to a project.&lt;/p&gt;

&lt;p&gt;Finally, I wanted to mention the more extreme approaches, such as fleets of agents or OpenClaw.
While I don’t think that our software development process can benefit from them or we would trust such things security-wise,
it is important to study what people are building and learning in this space.
If you push stuff to the extremes, you will see what breaks, under which conditions it breaks and what actually holds.
We can then apply these learnings to our processes.&lt;/p&gt;

&lt;h2 id=&quot;laying-out-next-steps&quot;&gt;Laying out next steps&lt;/h2&gt;

&lt;p&gt;Having a long introduction and providing context doesn’t help at all if you don’t take action.
Thus, I continued with a section on what actions I am taking.
As I’m the one doing a bold blog post, I should also be the one taking bold next steps.
As this is not a purely technical evolution, I have started preparing some in-person events to talk to people.
In addition, I will share more information on the topic in a virtual company-wide software engineering event.
My main goal with these events is to encourage people to experiment with these tools and discuss their learnings.
To enable experimentation, I not only need to encourage people but also understand what is holding them back and work to remove their blockers.&lt;/p&gt;

&lt;p&gt;Before I jump to a call to action for the reader, I enumerate some open discussion points that go beyond choosing the right tool to how the workflow should look.
This can be tied to the tools people are using, but at the moment, it seems orthogonal to the specific coding agent.
While I can’t list everything that needs to be discussed, I’ve listed the most prominent and/or obvious items.
As I’m posting this article internally, people can comment on it and maybe already start a discussion there or link to a deep dive on the topic.
In the context of our company, there is also a major topic that would immediately lead to larger discussions, so I have added a paragraph on it before finally jumping to the call to action.&lt;/p&gt;

&lt;h2 id=&quot;call-to-action&quot;&gt;Call to Action&lt;/h2&gt;

&lt;p&gt;The final part of the blog post is then my call to action to all my colleagues.
With my main objective being to have them experiment more, I start by asking them to install the most-hyped tools.
While you do not need to start using them immediately, you should have them installed so that this bit of friction is removed before you encounter a situation where you could apply them later.&lt;/p&gt;

&lt;p&gt;With everything prepared, I encourage them to consider every problem they encounter in the near future and whether they can use these tools to address it.
For matching situations, I strongly suggest that they also try out vibe coding.
While it isn’t a good fit for everything, there are many situations where looking at the code isn’t necessary.
If you haven’t done it in practice, it sounds scarier than it is (if used appropriately).&lt;/p&gt;

&lt;h2 id=&quot;did-i-cover-everything&quot;&gt;Did I cover everything?&lt;/h2&gt;

&lt;p&gt;Given the large and fast-moving nature of the topic, it was impossible to cover everything in this blog post.
I didn’t go into detail about any specific tools or techniques.
These are ones that will change quite quickly, and some of them even changed during the writing of this blog post.
One section I initially covered was the cost.
In the end, because the section became quite long, I separated it into its own blog post and will post it in about one week.
Agentic coding is not only costly because it consumes a lot of tokens, but it also involves a lot of bureaucracy in onboarding people to the new tools and conducting an information security review.
Furthermore, there’s a social and psychological cost because we see dramatic changes in the way work is happening, and you have a lot of social interactions about how this should happen, and what should be done first, and where we shall wait and see what time will tell us.&lt;/p&gt;</content><author><name></name></author><summary type="html">In the last two months, I wanted to get people to experiment more with agentic coding tools. While I have seen successful uses of them, some people still weren’t using them at all, and others stuck with one tool (mostly GitHub Copilot) and assumed that all other tools were similar. Given the changes we are currently observing in the software engineering space, the level of experimentation I was seeing at our company was lower than I would have expected. Still, there is a large crowd trying out everything, experimenting with new techniques and constantly seeking access to new tools. These should be the ones I want to encourage to keep doing it and help them remove any blockers along the way.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Deep technical blog posts are still worth it in the AI age</title><link href="https://uwekorn.com/2026/01/20/deep-tech-posts-are-worth-it.html" rel="alternate" type="text/html" title="Deep technical blog posts are still worth it in the AI age" /><published>2026-01-20T00:00:00+00:00</published><updated>2026-01-20T00:00:00+00:00</updated><id>https://uwekorn.com/2026/01/20/deep-tech-posts-are-worth-it</id><content type="html" xml:base="https://uwekorn.com/2026/01/20/deep-tech-posts-are-worth-it.html">&lt;p&gt;AI summaries mean that you need to click less on search results to find the actual information you’re looking for. 
But for me, as someone who writes a lot of deep tech in blog posts,
I have seen that it’s still worth it to write the blog post,
and it’s still worth it for the readers you want to read your articles to actually read those blog posts and get there with AI.
You won’t reach millions, but you still reach the people you really care about.&lt;/p&gt;

&lt;p&gt;In my example, I have triggered a bug in the macOS Linker in the conda-forge setting in &lt;a href=&quot;https://github.com/conda-forge/mysql-feedstock/pull/115&quot;&gt;mysql-feedstock#115&lt;/a&gt;.
This is a hard-to-debug issue because your compiler is segfaulting and not reporting an error.
In my case, the segmentation fault sadly led only to a very short stacktrace:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;% lldb &quot;/Users/…/arm64-apple-darwin20.0.0-ld&quot;
(lldb) target create &quot;/Users/…/arm64-apple-darwin20.0.0-ld&quot;
Current executable set to '/Users/…/arm64-apple-darwin20.0.0-ld' (arm64).
(lldb) run -demangle -lto_library …
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x000000019d488a80 libsystem_platform.dylib`_platform_strncmp$VARIANT$Base + 176
libsystem_platform.dylib`_platform_strncmp$VARIANT$Base:
-&amp;gt;  0x19d488a80 &amp;lt;+176&amp;gt;: ldr    q0, [x0], #0x10
    0x19d488a84 &amp;lt;+180&amp;gt;: ldr    q1, [x1], #0x10
    0x19d488a88 &amp;lt;+184&amp;gt;: cmeq.16b v1, v0, v1
    0x19d488a8c &amp;lt;+188&amp;gt;: and.16b v0, v0, v1
Target 0: (arm64-apple-darwin20.0.0-ld) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x000000019d488a80 libsystem_platform.dylib`_platform_strncmp$VARIANT$Base + 176
    frame #1: 0x00000001001c0538 arm64-apple-darwin20.0.0-ld`ld::passes::dylibs::doPass(Options const&amp;amp;, ld::Internal&amp;amp;) + 412
    frame #2: 0x0000000100013c04 arm64-apple-darwin20.0.0-ld`main + 732
    frame #3: 0x000000019d0b5d54 dyld`start + 7184
(lldb)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Given the sparse information, I felt quite lost.
I am used to debugging foreign software, but this sadly didn’t yield any useful information.
Still, in my effort to leverage the newly available LLM-based tools more, I pasted the stacktrace with some additional information into Gemini and Perplexity.
At first glance, neither of them led to useful responses, independently of how much information I gave them.
At a second look, the following (simpler) prompt &lt;a href=&quot;https://www.perplexity.ai/search/i-have-a-segmentation-fault-he-S16M9qvcRGStpSc7Ff6srA#0&quot;&gt;on Perplexity&lt;/a&gt; provided a crucial hint in the sources:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;I have a segmentation fault here:
 thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
 frame #0: 0x000000019d488a80 libsystem_platform.dylib`_platform_strncmp$VARIANT$Base + 176
 frame #1: 0x00000001001c0538 arm64-apple-darwin20.0.0-ld`ld::passes::dylibs::doPass(Options const&amp;amp;, ld::Internal&amp;amp;) + 412
 frame #2: 0x0000000100013c04 arm64-apple-darwin20.0.0-ld`main + 732
 frame #3: 0x000000019d0b5d54 dyld`start + 7184
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I was surprised to find a reference to &lt;a href=&quot;https://lucascolley.github.io/blog/2025-09-26-macos-26-c-compiler/&quot;&gt;lucascolley.github.io&lt;/a&gt;.
While my stack trace looks very generic, Lucas is someone I recognised due to his involvement in conda-forge.
In his article, he actually mentioned that he changed the line that segfaulted for me
If this had been hidden in a GitHub commit, I would not have expected Perplexity to pick it up.
But since Lucas has written the blog post, I did get a very crucial hint (or possibly the solution) at what is breaking here.&lt;/p&gt;

&lt;p&gt;This enabled me to resolve the issue in &lt;a href=&quot;https://github.com/conda-forge/cctools-and-ld64-feedstock/pull/103&quot;&gt;cctools-and-ld64-feedstock#103&lt;/a&gt; by adding a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nullptr&lt;/code&gt; check to the existing patch. Instead of several hours of debugging and understanding a complex codebase, this could be fixed in less than 15 minutes.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;While AI-assisted search may mean the overall number of readers of a blog post goes down, it still exposes the right readers to the right posts. 
In my case, I would even argue that I would not have (re-)discovered that post if it were not for AI-assisted search.
My traceback provided very limited information, and a search on classic search engines didn’t yield any results related to my issue.
This makes me personally more confident in writing more of this kind of blog posts.
They will not reach large masses, but actually the people I want to share my knowledge with and that could profit heavily from it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feature image from &lt;a href=&quot;https://unsplash.com/de/@zhpix?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Pascal Meier&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/de/fotos/wendeltreppe-fotografie-5Z5As4cdE5k?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><author><name></name></author><summary type="html">AI summaries mean that you need to click less on search results to find the actual information you’re looking for. But for me, as someone who writes a lot of deep tech in blog posts, I have seen that it’s still worth it to write the blog post, and it’s still worth it for the readers you want to read your articles to actually read those blog posts and get there with AI. You won’t reach millions, but you still reach the people you really care about.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Learnings from the Python 3.14 migration</title><link href="https://uwekorn.com/2025/12/15/py314-learnings.html" rel="alternate" type="text/html" title="Learnings from the Python 3.14 migration" /><published>2025-12-15T00:00:00+00:00</published><updated>2025-12-15T00:00:00+00:00</updated><id>https://uwekorn.com/2025/12/15/py314-learnings</id><content type="html" xml:base="https://uwekorn.com/2025/12/15/py314-learnings.html">&lt;p&gt;Personally, I was keen to ensure that &lt;a href=&quot;https://uwekorn.com/2025/12/01/py314-availability-on-conda-forge.html&quot;&gt;Python 3.14 availability on conda-forge&lt;/a&gt; was as good as possible on the actual release day.
conda-forge’s build infrastructure is a massive benefit, and I wanted to show others how this can result in useful progress for them.&lt;/p&gt;

&lt;p&gt;During the work on enabling as many packages as possible to be installable with Python 3.14,
I came across several things that could be prepared for the next Python release to improve the overall package availability on release day.&lt;/p&gt;

&lt;h2 id=&quot;building-python-alphas-and-betas&quot;&gt;Building Python alphas and betas&lt;/h2&gt;
&lt;p&gt;The single most important obstacle to making Python builds available is the first successful release candidate (RC) build.
This can be improved by working on the RC build as early as possible.
However, as the majority of time is spent updating the conda-forge-specific patches to the newest Python version, we can already minimise this beforehand.&lt;/p&gt;

&lt;p&gt;For the Python 3.14 series, work began with the PR to &lt;a href=&quot;https://github.com/conda-forge/python_abi-feedstock/pull/30&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python_abi-feedstock&lt;/code&gt; to add Python 3.14 support&lt;/a&gt; on July 8.
This was followed three days later with a PR to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python-feedstock&lt;/code&gt; to add &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/805&quot;&gt;Python 3.14.0rc1&lt;/a&gt;.
This PR was merged a month later, which meant that &lt;strong&gt;the first Python 3.14 build was available on August 11&lt;/strong&gt;.
Four days later, &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/809&quot;&gt;Python 3.14.0rc2 was merged&lt;/a&gt;.
On August 20, we started the &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7598&quot;&gt;migration for Python 3.14&lt;/a&gt;.
This means we started the migration &lt;strong&gt;48 days before the final release&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To prepare for Python 3.15, we already have an open (and green) &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/833&quot;&gt;pull request for Python 3.15.0a2&lt;/a&gt;.
The &lt;a href=&quot;https://github.com/conda-forge/python_abi-feedstock/pull/31&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python_abi&lt;/code&gt; PR for Python 3.15&lt;/a&gt; was already merged on November 16.
While there will be several changes until the first release candidate is available, building early means that the incremental changes will be smaller.
Thus, building the first release candidate should take less time if we maintain a steady pace of development releases.&lt;/p&gt;

&lt;p&gt;While working on the Python 3.15.0a{1,2} build, I also manged to make my first CPython contribution.
There is a new function called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;types_world_is_stopped&lt;/code&gt; in CPython that should only be compiled in certain (debug) settings.
As conda-forge’s debug build is without assertions (whether this sould be, is another discussion), we did hit an edge case which is not tested by CPython’s CI.
My contribution was then to &lt;a href=&quot;https://github.com/python/cpython/pull/142039&quot;&gt;extend the C macro guard to also cover this case&lt;/a&gt;.
As this has been merged upstream, we can drop this patch in the next alpha release and aren’t accumulated more patches for the next release (for now).&lt;/p&gt;

&lt;h2 id=&quot;common-problems-of-package-updates&quot;&gt;Common Problems of Package Updates&lt;/h2&gt;
&lt;p&gt;While working on several pull requests that were failing during the Python 3.14 migration, it was easy to identify patterns where packages failed to update to Python 3.14.
Many packages already had failing pull requests for Python 3.13, but would have been easily migratable to both Python releases.
The problem there was often that for Python 3.13, we had dropped &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setuptools&lt;/code&gt; as a hard dependency in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip&lt;/code&gt;.
Adding the build backend (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setuptools&lt;/code&gt;) explicitly to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host&lt;/code&gt; environment fixed a lot of builds.&lt;/p&gt;

&lt;p&gt;Another change in Python 3.14 was that it was more cautious about how often the reference count is increased for an object.
Thus, some unit tests were failing in different packages that checked for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;refcount == 2&lt;/code&gt;, whereas in Python 3.14 these objects would only have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;refcount&lt;/code&gt; of 1.&lt;/p&gt;

&lt;p&gt;In this and many other (package-specific) failures, upstream often already had a fix merged into main, but not for the current release.
Thus, to get a Python 3.14 build for the currently released version, one needs to backport this fix.
My approach to get this working is by adding an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit 1&lt;/code&gt; to the top of the build script and then running the build.
Once the build hits the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit 1&lt;/code&gt; in the script, it (obviously) fails.
Then I can &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cd&lt;/code&gt; into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;work&lt;/code&gt; directory of the current build and add the downloaded source code into a temporary git tree using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git init . &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &quot;Initial commit&quot; --no-verify --no-gpg-sign&lt;/code&gt;.
The upstream fix can then be obtained by adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.patch&lt;/code&gt; to the URL of the commit or pull request on GitHub.
By using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git am --reject &amp;lt;patch&amp;gt;&lt;/code&gt;, we can add that patch to the git tree and fix any conflicts that occur.
We can then use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git format-patch --no-signature HEAD^&lt;/code&gt; to generate a clean patch that we can add to the recipe.&lt;/p&gt;

&lt;h2 id=&quot;dealing-with-half-abandoned-feedstock&quot;&gt;Dealing with (half) abandoned feedstock&lt;/h2&gt;
&lt;p&gt;As not all feedstocks are actively maintained, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/core&lt;/code&gt; can step in if a contribution has waited at least seven days for a review from the maintainer (there should be an explicit ping!).
Many Python 3.14 pull requests were immediately successful;
however, the maintainers were inactive.
Thus, I manually reviewed them and explicitly notified the maintainers that they appear to be fine for merging.
For a future release, it would be nice if the autotick bot could also automatically ping maintainers if a pull request has green builds, a CI entry for Python 3.x and has been open without any interaction for Y days.
Then, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/core&lt;/code&gt; would only need to review the PRs that are at least 7-10 days old and have passing CI.&lt;/p&gt;

&lt;p&gt;The seven-day waiting period on these PRs is a bit annoying if you want to ramp up the Python 3.x builds extremely fast,
but given that we merged most dormant PRs 20 days after the final release and got the major packages (with dormant maintainers) in before the final release, we were already quite successful.
One thing that would have helped me a lot in pinging dormant releases would have been to see the CI status for each pull request directly on the status page.
While writing this post, &lt;a href=&quot;https://github.com/conda-forge/conda-forge.github.io/pull/2668&quot;&gt;showing the CI status in the migration table&lt;/a&gt; was contributed by &lt;a href=&quot;https://github.com/Carreau&quot;&gt;someone&lt;/a&gt; to conda-forge.org.&lt;/p&gt;

&lt;h2 id=&quot;major-nodes-in-the-migration-path&quot;&gt;Major nodes in the migration path&lt;/h2&gt;
&lt;p&gt;There is a limited number of central packages in the migration path.
While there are some basic ones, such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setuptools&lt;/code&gt;, that are used by a huge number of downstream projects that already have Python 3.14 support early on,
there are other packages that are not that early with it.
Examples for this are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numba&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pytorch&lt;/code&gt;.
These stood out as the packages that were (and still are) at the top of the list of important packages to migrate on the &lt;a href=&quot;https://conda-forge.org/status/migration/?name=python314&quot;&gt;Python 3.14 migration status page&lt;/a&gt;.
The earlier we hit those packages, the quicker we can also provide feedback to upstream on what works and what doesn’t.
Similarly, in some cases, upstream actually uses a conda package in their CI.
With us then hitting them in the migration tree, they often can start adding a Python 3.14 job to their CI, as all their dependencies are now available.&lt;/p&gt;

&lt;p&gt;Even if they don’t use conda packages in their CI, and we cannot provide them with additional information on failures,
hitting them faster ensures that we know that we will need to spend some time on them quite soon.
This means that we can, in the meantime, invest in ensuring they are on the latest release and that the recipe meets modern standards.&lt;/p&gt;

&lt;h2 id=&quot;preparing-for-python-315&quot;&gt;Preparing for Python 3.15&lt;/h2&gt;
&lt;p&gt;While Python 3.14 was the release with the best availability curve on conda-forge,
we want to ensure it is surpassed by the next release.
Thus, we can already start preparing for the Python 3.15 release now.
The most obvious one is &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/833&quot;&gt;starting to build Python 3.15 pre-releases&lt;/a&gt; as early as possible.
This also enables us to &lt;a href=&quot;https://github.com/python/cpython/pull/142039&quot;&gt;submit patches upstream to CPython&lt;/a&gt; instead of keeping them local to conda-forge.&lt;/p&gt;

&lt;p&gt;In the initial phase of the migration, CI is typically overloaded by the number of pull requests opened.
Consequently, the queue often becomes so long that the migration needs to be paused, allowing the remaining work on conda-forge to continue.
Thus, in this initial phase, we should ensure &lt;a href=&quot;https://github.com/pulls?q=+is:pr+%22Rebuild+for+python+3.14%22+org:conda-forge+sort:created-asc+&quot;&gt;that the packages migrated first&lt;/a&gt; are all using rattler-build to minimise resources as much as possible.&lt;/p&gt;

&lt;p&gt;Before we even start the migration, we can also migrate some packages for the upcoming Python release.
Often, packages don’t need to be specific to a Python release. Some packages can be marked as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; if they don’t contain any binary code at all.
This is not possible for all non-binary packages, but over the years, we have extended the mechanics of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; to accommodate many cases that could not be converted previously.&lt;/p&gt;

&lt;p&gt;If packages contain binary code, they can still be built for a new Python release if they only utilise the &lt;a href=&quot;https://docs.python.org/3/c-api/stable.html#limited-c-api&quot;&gt;limited API&lt;/a&gt;.
The support for such packages (ABI3) is relatively new in conda-forge and thus seldom utilised.
For example, most packages that use Rust code are actually ABI3-compatible and could be marked as such.
This would also ease the load on CI in general, as the Python version matrix would be reduced to one entry per architecture.&lt;/p&gt;</content><author><name></name></author><summary type="html">Personally, I was keen to ensure that Python 3.14 availability on conda-forge was as good as possible on the actual release day. conda-forge’s build infrastructure is a massive benefit, and I wanted to show others how this can result in useful progress for them.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Personal Efficiency gains using AI (Dec’25)</title><link href="https://uwekorn.com/2025/12/08/personal-efficency-using-ai.html" rel="alternate" type="text/html" title="Personal Efficiency gains using AI (Dec’25)" /><published>2025-12-08T00:00:00+00:00</published><updated>2025-12-08T00:00:00+00:00</updated><id>https://uwekorn.com/2025/12/08/personal-efficency-using-ai</id><content type="html" xml:base="https://uwekorn.com/2025/12/08/personal-efficency-using-ai.html">&lt;p&gt;In recent times, it has become common for people to post about how they’re becoming more efficient with the use of AI.
I want to follow that trend and also provide a quick overview of where I’ve been using AI in my workflow over the last months to ensure I’m as efficient as possible.
Some of the gains have been in place for months; some of the things I’m using are actually ones I discovered in the last week, and make me a lot more productive.
Sadly, there are still many places where I wish I could utilise AI to be a bit more productive, but we’re making progress.&lt;/p&gt;

&lt;h2 id=&quot;writing-text&quot;&gt;Writing Text&lt;/h2&gt;
&lt;p&gt;Writing text, especially in English, is one of the most common activities I engage in during my daily work.
For that, I have been using Grammarly for a long time to correct many of the grammatical mistakes I make as a non-native English speaker.
This has helped me improve significantly, both in the end result and in the text I write before it gets corrected.&lt;/p&gt;

&lt;p&gt;Additionally, I’ve switched to using WisprFlow to dictate some of my text.
This is particularly useful if you need to write large chunks of text without typing them, or if you’re on the go and only have a mobile phone.
Then typing the amount of text will be really a hassle.&lt;/p&gt;

&lt;p&gt;Sadly, what Wispr is going to add as text is not perfect, so especially for blog posts and longer content, you need to review it once or twice.
Besides some typos or misspelt words, especially things like programming-specific abbreviations, are not well matched and often can’t come up in a quite weird way.
Still, some of the typical ones, like MCP, are perfectly recognised by Wispr.
There is always a pass with Grammarly required afterwards.
Luckily, LLMs are not very picky about the correctness of your text, and thus, this works perfectly for prompting them.&lt;/p&gt;

&lt;h2 id=&quot;research&quot;&gt;Research&lt;/h2&gt;
&lt;p&gt;My web search has shifted mostly to using Perplexity if I need a piece of information.
I can type in a rough search statement and don’t need to worry about using the correct terms to get a match.
Instead, Perplexity is quite good at finding search terms that match my question very well.
In comparison to other LLM-assisted web searches, Perplexity is much more snappy, and I also perceive their citations as a lot better.
For things where I know exactly what the terms are, I’m still sticking to Google, as a simple web search is much faster.
This is particularly true for shopping; here, I often already know exactly what I want and thus don’t really need or want AI assistance.&lt;/p&gt;

&lt;p&gt;If I want to conduct in-depth research on a topic, I often start by searching using both the standard and deep research features simultaneously.
Often, Deep Research leads to a much better understanding of a topic than a quick web search;
however, there have been several instances where Deep Research took a peculiar turn and presented me with a lot of information that was tangential to my question but not at its core.
In these cases, the normal search feature of Perplexity actually led to a much better answer.&lt;/p&gt;

&lt;p&gt;My most common usage for Perplexity is actually looking up solutions for error messages.
Due to my work on &lt;a href=&quot;https://conda-forge.org/&quot;&gt;conda-forge&lt;/a&gt;, I frequently encounter errors in third-party software.
This also happens in using this software during development.
While a standard LLM can often reason quite well about software errors, it is limited by its training dataset.
My errors are in over 80% of all cases connected to software releases made in the last two months. Thus, if you do a web search and even include the version changes, the explanations for possible fixes improve drastically.&lt;/p&gt;

&lt;h2 id=&quot;llms-in-software-development&quot;&gt;LLMs in software development&lt;/h2&gt;
&lt;p&gt;The most common area where LLMs have brought improvements, as a software engineer, is in coding.
Due to my role as a manager, I no longer make significant contributions to larger codebases.
With that in mind, someone who does such work might use a completely different stack.&lt;/p&gt;

&lt;p&gt;While still a significant chunk of my work day is spent on github.com, I rarely use GitHub Copilot.
In most cases, there is a tool that does the job better for me.
Better in this case could mean faster or with a better UX.
I have not yet compared the quality of each of these tools, as in my cases, there have not been significant differences on this side.&lt;/p&gt;

&lt;p&gt;Producing new code is a small part of my workday.
With LLMs, the share of time I spent on this didn’t change; simply, the amount of produced code increased.
This is mainly due to me now letting Claude Code write a lot of small automation scripts that ease tasks that I never considered automating before.
These tasks don’t take that long, and without the LLM-assisted coding tools, I would have probably taken up an hour or more to write the automation.
With prompting, reviewing, and testing these automations, the time required is now typically within a maximum of five minutes per task.
This makes many more tasks in my daily life worthwhile to automate.&lt;/p&gt;

&lt;p&gt;If I do make a more significant change in a codebase, I tend to use Cursor.
The UI allows me to review the proposed changes more effectively than in a TUI like Claude Code.
It also has the advantage of being significantly faster than GitHub Copilot.
Its speed is one of the surprising aspects/benefits of it.
Many of my colleagues initially seem reluctant to try out Cursor, as it looks similar to Copilot, but they are then positively surprised by its speed.&lt;/p&gt;

&lt;p&gt;If I want to understand large code bases and use the model for querying them, I switch back to Claude Code.
This is mostly due to my love for the terminal (I’m a NeoVim power user), but also because of the distraction-free presentation of everything in Claude Code.
Querying a codebase in my workday can involve either finding a specific functionality within a larger codebase or initiating a larger review of the codebase.
For the latter, you need to structure the prompt according to the type of review you want to conduct.
However, it really helps to break down a project into segments, build an understanding together with the LLM, and ask more specific questions in certain parts of the code.
Here, better documentation or a good CLAUDE.md (which is essentially documentation) really helps to achieve better, more targeted results.&lt;/p&gt;

&lt;p&gt;LLMs (not a particular one) are great at finding the actual error in a very large CI log.
While these errors generally occur at the end of a log file, they are not always at the very end, as some cleanup occurs once the actual job fails.
Additionally, there are many cases where a single core error occurs, but multiple exceptions are raised on top (e.g., in the case of a failed compilation) that obscure the search for the initial failure.
Using an LLM can save you anywhere from 30 to 60 seconds, but if you do this often or in an automated fashion, the time savings also add up.
LLMs can then also help and explain the reason for the error.
In the case of some C++ errors, this also helped me to understand which line actually explained the error.
For certain failure scenarios, this is sadly non-trivial to understand.&lt;/p&gt;

&lt;p&gt;If the error is in code I’m working on, I usually switch to local development using Claude Code and let it figure out how to fix it.
If the error occurs in a third-party tool (as is the case in my conda-forge work), I’ll use, as mentioned above, LLM-assisted web search to obtain a suggestion on how to resolve it.&lt;/p&gt;

&lt;p&gt;The combination of LLM-assisted error detection in logs and web search for finding a solution to the problem works so well that I have used it as an onboarding task for an intern.
This is a neat project that allows one to learn the frameworks for dealing with LLMs, understand how different LLMs yield different results, and identify the engineering challenges that arise in this context.
One of the findings we observed was that the mini variants of the most common LLMs identified errors in the log file; they only listed a set of errors, whereas the larger models continuously pinpointed the actual error that caused the failure and could extract that specific information.
We look forward to sharing more information on this soon.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Overall, LLMs help me to solve a lot of small things more efficiently in several areas.
There is not one single thing that they have made a massive difference in.
It’s challenging to quantify the improvement, but overall, it has a very noticeable and positive impact on my workflow.
While many things are faster now, I also get distracted by them, as I want to see whether they can solve other problems or spend time understanding how they work.&lt;/p&gt;

&lt;p&gt;My general takeaway from all the experience I gained with using LLMs in my daily work is that you should be in a constant testing phase.
New tools or models appear on a daily basis and can help solve some challenges in a different way.
Without a testing routine, it is hard to follow, and it will also be hard to catch up.
I don’t think that it pays off to wait until the “dust has settled” and until clear techniques have emerged that don’t get updated so frequently.
You will need to catch up on all the development anyway, and that won’t be easy if you don’t do it incrementally.
At the same time, if you wait and don’t constantly test new things, you will also miss out on a lot of efficiency gains that (accumulated) make an enormous impact on the daily work.&lt;/p&gt;</content><author><name></name></author><summary type="html">In recent times, it has become common for people to post about how they’re becoming more efficient with the use of AI. I want to follow that trend and also provide a quick overview of where I’ve been using AI in my workflow over the last months to ensure I’m as efficient as possible. Some of the gains have been in place for months; some of the things I’m using are actually ones I discovered in the last week, and make me a lot more productive. Sadly, there are still many places where I wish I could utilise AI to be a bit more productive, but we’re making progress.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python 3.14 Availability on conda-forge</title><link href="https://uwekorn.com/2025/12/01/py314-availability-on-conda-forge.html" rel="alternate" type="text/html" title="Python 3.14 Availability on conda-forge" /><published>2025-12-01T00:00:00+00:00</published><updated>2025-12-01T00:00:00+00:00</updated><id>https://uwekorn.com/2025/12/01/py314-availability-on-conda-forge</id><content type="html" xml:base="https://uwekorn.com/2025/12/01/py314-availability-on-conda-forge.html">&lt;p&gt;As I was intrigued by &lt;a href=&quot;https://bsky.app/profile/hugovk.dev/post/3m3376x6egc2r&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@hugovk&lt;/code&gt;’s BlueSky post on usable Python 3.14 packages on PyPI&lt;/a&gt;, I wanted to see how the situation is on conda-forge.
Here, we have a different setup where central tooling pushes even more towards availability.&lt;/p&gt;

&lt;p&gt;While for wheel builds &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cibuildwheel&lt;/code&gt; will already nudge the majority of upstream maintainers to build wheels before the release,
on conda-forge, we have an even more intense nudge by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;regro-cf-autotick-bot&lt;/code&gt; opening PRs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rebuild for Python 3.14&lt;/code&gt; on packages where all dependencies already support the new release.
This makes it even more noticeable for maintainers that they can build their package for Python 3.14.&lt;/p&gt;

&lt;p&gt;In contrast to PyPI, the people responsible for the Python 3.14 builds are different.
In the PyPI case, the workload is on the upstream maintainers of a package to add Python 3.14 builds.
In conda-forge, you have feedstock maintainers (who sometimes include upstream maintainers) and eager contributors who would like to get a working Python 3.14 environment as soon as possible.
If people are looking at more than a single artefact, they will gain a better understanding of how to resolve failing builds for a new Python version.&lt;/p&gt;

&lt;h2 id=&quot;when-do-packages-get-available-for-a-new-python&quot;&gt;When do packages get “available” for a new Python?&lt;/h2&gt;
&lt;p&gt;As outlined in the &lt;a href=&quot;https://conda-forge.org/blog/2025/10/09/python-314/&quot;&gt;conda-forge blog post about the Python 3.14 release&lt;/a&gt;, builds for the new Python version began once the first release candidate was available.
These packages are not yet immediately available to the end-user as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python&lt;/code&gt; package itself is not released to the main channel, but rather in the label &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/label/python_rc&lt;/code&gt;.
By putting the Python release (actually, we let the package depend on a metapackage in that channel) behind a label, we can ensure that end-users don’t accidentally get a Python 3.14 environment.
Once the main Python release has happened, all packages built for Python 3.14 become immediately available, as there is now a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python&lt;/code&gt; package without a dependency on this magic label.&lt;/p&gt;

&lt;p&gt;Packages that are designated as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; or those built as ABI3 packages on conda-forge don’t require any modifications or rebuilds to become usable.
There, the old releases are already suited for Python 3.14 and can be installed once a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python&lt;/code&gt; build is available.
For a new Python version, we only need to rebuild packages that have a dependency on the minor version of Python, so-called arch-specific packages.&lt;/p&gt;

&lt;h2 id=&quot;availability-in-the-first-100days-since-a-release&quot;&gt;Availability in the first 100days since a release&lt;/h2&gt;
&lt;p&gt;To assess how quickly Python packages become available in conda-forge, we want to examine the speed at which we have built binary packages in the first 100 days since the final Python release.
We will also investigate how many packages were actually built before the final release, so that we can determine whether we can leverage the availability of release candidates.&lt;/p&gt;

&lt;p&gt;If we have a look at binary Python packages that were built once a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python&lt;/code&gt; build was available for the currently (conda-forge) supported Python versions, we get the following plot:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/py314/package_availability_combined_100days.png&quot; alt=&quot;Python 3.14 binary package availability&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If we compare the Python 3.14 line to the rest, we see that growth began much earlier than for the other Python versions and that, at its current state, it has also progressed much further before the 100-day mark than any other Python release has yet achieved.
There are also three pivotal points you can see:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;About 40 days before the final release mark, the migration really started. Some crucial packages were finally migrated to Python 3.14, allowing us to migrate a significant number of packages.&lt;/li&gt;
  &lt;li&gt;About five days before the final release, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&lt;/code&gt; had been merged, and then a lot of other downstreams were available for migration.&lt;/li&gt;
  &lt;li&gt;About 25 days after the Python 3.14 final release. There have been days when I spent time reviewing numerous open PRs and merged many of them. These were ready and could be merged, but the maintainer didn’t have the time, or the feedstock itself was stale, and it needed someone from core to actually review and merge them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you examine the Python versions over time, we can see that with new Python releases, we were able to utilise the availability of release candidates much better and could start building binary packages much earlier.
At the same time, we can also see that the later Python releases actually had fewer packages built at the 100-day mark.
This is not actually due to the community being less active, but there are two additional reasons that enabled us to migrate packages for a Python version early, without actually building them for the specific Python release.
We will examine these reasons in the next paragraphs.&lt;/p&gt;

&lt;h2 id=&quot;migrating-packages-for-new-unavailable-pythons&quot;&gt;Migrating packages for new, unavailable Pythons&lt;/h2&gt;
&lt;p&gt;Building Python-version-specific binary packages requires us to have the Python minor release available;
however, there are also other mechanisms we can use to build a Python package that may contain binaries to ensure compatibility with future Python releases.
Many packages on conda-forge are actually accidentally Python version-specific, but can be converted with some trickery into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python packages&lt;/code&gt;, which are then usable for future Python releases.
If we examine packages that were binary packages in Python 3.10 and later migrated to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt;, we can see that in later Python minor releases, packages were even faster available.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/py314/package_availability_with_noarch_combined_100days.png&quot; alt=&quot;Python 3.14 binary and noarch package availability&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Marking a package as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; works if the package doesn’t contain any binaries.
If the package actually contains binaries that are specific to Python, there’s still a trick that a lot of those can be ABI3, which means they’re compatible in binary form with many Python minor releases, as long as they use the &lt;a href=&quot;https://docs.python.org/3/c-api/stable.html#limited-c-api&quot;&gt;limited ABI&lt;/a&gt;.
Python 3.14 continues to be ABI3 compatible, and thus we can utilise all the packages that were built for ABI3 immediately with the availability of Python 3.14.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/py314/package_availability_with_noarch_abi3_combined_100days.png&quot; alt=&quot;Python 3.14 binary, ABI3 and noarch package availability&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If we count in ABI3 packages and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; packages that were once binary packages, we can see that the Python 3.14 release was the fastest ever in availability in conda-forge’s history.
With these things in mind, we hope to have an even faster Python 3.15 availability.&lt;/p&gt;

&lt;p&gt;Disclaimer: I mentioned a BlueSky post in the beginning. This has only inspired me, but sadly, the numbers here are not comparable to those because they look at the general marking of packages being available as Python 3.14. Whereas we’re looking in this post about the availability of binary packages for Python 3.14. In the BlueSky post, packages marked as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noarch: python&lt;/code&gt; wouldn’t be counted towards availability, but only those where you explicitly add Python 3.14 support.&lt;/p&gt;</content><author><name></name></author><summary type="html">As I was intrigued by @hugovk’s BlueSky post on usable Python 3.14 packages on PyPI, I wanted to see how the situation is on conda-forge. Here, we have a different setup where central tooling pushes even more towards availability.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Learnings from five weeks of conda-forge logging</title><link href="https://uwekorn.com/2025/11/24/learnings-from-five-weeks-of-conda-forge-logging.html" rel="alternate" type="text/html" title="Learnings from five weeks of conda-forge logging" /><published>2025-11-24T00:00:00+00:00</published><updated>2025-11-24T00:00:00+00:00</updated><id>https://uwekorn.com/2025/11/24/learnings-from-five-weeks-of-conda-forge-logging</id><content type="html" xml:base="https://uwekorn.com/2025/11/24/learnings-from-five-weeks-of-conda-forge-logging.html">&lt;p&gt;During the last five weeks 
(&lt;a href=&quot;https://uwekorn.com/2025/09/18/week37-conda-forge.html&quot;&gt;2025-37&lt;/a&gt;,
&lt;a href=&quot;https://uwekorn.com/2025/10/12/week38-conda-forge.html&quot;&gt;2025-38&lt;/a&gt;,
&lt;a href=&quot;https://uwekorn.com/2025/10/14/week39-conda-forge.html&quot;&gt;2025-39&lt;/a&gt;,
&lt;a href=&quot;https://uwekorn.com/2025/10/16/week40-conda-forge.html&quot;&gt;2025-40&lt;/a&gt;,
and &lt;a href=&quot;https://uwekorn.com/2025/10/20/week41-conda-forge.html&quot;&gt;2025-41&lt;/a&gt;)
I logged my conda-forge activity as a blog post.
Instead of only reporting on it, I also wanted to have a look at what I have been doing there and whether things could be automated more.&lt;/p&gt;

&lt;p&gt;One of the major points of my conda-forge output is the green contribution graph I have on GitHub.
This is partly nice to look at, as it has impressive numbers, but at the same time, it is also a clear sign of missing automation.
If I can manually make so many contributions, there must be a lot of them, despite a very small cognitive load.
These ones are most likely to be better automated than I spending my time on them.&lt;/p&gt;

&lt;p&gt;One of those examples where a lot of manual work is done are the migrations for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-c-*&lt;/code&gt; stack.
These are the C packages that make up the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-cpp-sdk&lt;/code&gt;.
With the current automation, we can start migrations quite easily, which automerge for a single package.
But often, the migration makes only sense if we update multiple of them at once.
Otherwise, the migration of a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-c-*&lt;/code&gt; package will get stuck if another is not updated simultaneously.
This typically resulted in some manual work on my part in the past. Additionally, the number of PRs when rebuilding for single packages is producing quite a bit of noise.&lt;/p&gt;

&lt;p&gt;To streamline the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-c-*&lt;/code&gt; migrations, I now have a script &lt;a href=&quot;https://github.com/xhochy/cf-tooling/blob/eaaaf8f27bcbe578ff4102faa253b6b6429ad81b/make_aws_migration.py&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make_aws_migration.py&lt;/code&gt;&lt;/a&gt; that checks which AWS packages can be upgraded in the stack and submits a PR that does exactly that. To minimise the noise this generates, I will manually run this once or twice a month. You can see an example of this in &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7919&quot;&gt;Migrate for aws-c-* Nov’11&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Go compiler on conda-forge was another source that included unnecessary manual work on my part. If patches applied successfully, it is fine to &lt;a href=&quot;https://github.com/conda-forge/go-feedstock/commit/495eafc983e9a119c8cddf67d0b2a51cd8c4887e&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;automerge&lt;/code&gt; the PRs there&lt;/a&gt;. PRs on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go-activation&lt;/code&gt; also needed to be rerun once the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; builds were done. Instead, we can use &lt;a href=&quot;https://github.com/conda-forge/go-activation-feedstock/commit/41a1a8c4ed7ba61bda89a0076e818f0cb5464aca&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;check_solvable: true&lt;/code&gt;&lt;/a&gt; to only issue the version update PR once the underlying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; builds are available.&lt;/p&gt;

&lt;p&gt;Another typical maintenance task on Go and on NodeJS is that we not only want updates for the latest release, but also for older release versions. As the &lt;a href=&quot;https://github.com/regro/cf-scripts&quot;&gt;conda-forge automation&lt;/a&gt; only supports updating the latest release on a feedstock, this has been a manual task. In the long term, it would be beneficial if the automation also updated versions on maintenance branches. As an intermediate step, I wrote (partially AI-coded) scripts (&lt;a href=&quot;https://github.com/xhochy/cf-tooling/blob/3244f93c5522e6f53c25ceb8675967b0325c9044/update_go_releases.py&quot;&gt;one for Go&lt;/a&gt; and &lt;a href=&quot;https://github.com/xhochy/cf-tooling/blob/3244f93c5522e6f53c25ceb8675967b0325c9044/update_nodejs_releases.py&quot;&gt;one for Node.js&lt;/a&gt;) that check for version updates and issue pull requests. This could also be used for Python, but here, many more maintainers are actively subscribed to the release announcements, and thus, my scripts won’t be much faster/simpler here.&lt;/p&gt;

&lt;p&gt;Overall, there seems to be no further patterns that I could automate. There are many small breakages that a contributor’s (and sometimes really “my”) attention is required. This includes things like packages that are already on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;automerge&lt;/code&gt; but fail due to an unexpected change. Here, my contributions won’t be overlooked, but I often find myself spending a significant amount of time scrolling and clicking until I locate the actual error in the log. This is something to work on in the future.&lt;/p&gt;</content><author><name></name></author><summary type="html">During the last five weeks (2025-37, 2025-38, 2025-39, 2025-40, and 2025-41) I logged my conda-forge activity as a blog post. Instead of only reporting on it, I also wanted to have a look at what I have been doing there and whether things could be automated more.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2025-41: A week in conda-forge</title><link href="https://uwekorn.com/2025/10/20/week41-conda-forge.html" rel="alternate" type="text/html" title="2025-41: A week in conda-forge" /><published>2025-10-20T00:00:00+01:00</published><updated>2025-10-20T00:00:00+01:00</updated><id>https://uwekorn.com/2025/10/20/week41-conda-forge</id><content type="html" xml:base="https://uwekorn.com/2025/10/20/week41-conda-forge.html">&lt;p&gt;This week was the Python 3.14 release, and it will also be the final week where I log my conda-forge work. While it is interesting for me to see what I do work, it is also additional work that keeps me from contributing to conda-forge itself. Still, as a follow-up, I will write at least one more post that reviews the kind of work I have done in the last weeks and how that could be made more efficient.&lt;/p&gt;

&lt;p&gt;It started this time with a simple merge of updates for pre-commit hooks in &lt;a href=&quot;https://github.com/conda-forge/conda-forge-repodata-patches-feedstock/pull/1091&quot;&gt;conda-forge-repodata-patches-feedstock#1091&lt;/a&gt;. &lt;a href=&quot;https://github.com/conda-forge/go-feedstock/pull/300&quot;&gt;go-feedstock#300&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/onnx-feedstock/pull/136&quot;&gt;onnx-feedstock#136&lt;/a&gt; were similarly trivial merges. In addition, I merged &lt;a href=&quot;https://github.com/conda-forge/deepsearch-glm-feedstock/pull/8&quot;&gt;deepsearch-glm-feedstock#8&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/lighttpd-feedstock/pull/45&quot;&gt;lighttpd-feedstock#45&lt;/a&gt; because the maintainers didn’t react on a ping for over a week. A new release of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pdm&lt;/code&gt; also required a rebase of the patch we keep in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge&lt;/code&gt; in &lt;a href=&quot;https://github.com/conda-forge/pdm-feedstock/pull/155&quot;&gt;pdm-feedstock#155&lt;/a&gt;. While I was at it, I took the opportunity and converted the feedstock to a v1 recipe.&lt;/p&gt;

&lt;p&gt;A colleague of mine wanted to update the nodejs version for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code-server&lt;/code&gt;, but &lt;a href=&quot;https://github.com/conda-forge/code-server-feedstock/pull/134&quot;&gt;code-server-feedstock#134&lt;/a&gt; failed as the feedstock was still using a manually pinned docker image. Later this week, we also needed to trigger a rerun of the CI jobs in &lt;a href=&quot;https://github.com/conda-forge/code-server-feedstock/pull/135&quot;&gt;code-server-feedstock#135&lt;/a&gt;. This failed because of a virtual package issue in rattler-build for cross-compiled packaged. This was fixed in the meantime using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rattler-build 0.48.1&lt;/code&gt;, and thus the rerun succeeded.&lt;/p&gt;

&lt;p&gt;In another “support case” for my colleagues, I added  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;types-aioboto3&lt;/code&gt; to conda-forge via &lt;a href=&quot;https://github.com/conda-forge/staged-recipes/pull/31182&quot;&gt;staged-recipes#31182&lt;/a&gt;. Some other typing dependencies were outdated and thus, I have converted the recipe to the v1 format and added myself as a maintainer in &lt;a href=&quot;https://github.com/conda-forge/types-s3transfer-feedstock/pull/11&quot;&gt;types-s3transfer-feedstock#11&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/types-aiobotocore-feedstock/pull/13&quot;&gt;types-aiobotocore-feedstock#13&lt;/a&gt;. Once these were merged, I backfilled the feedstocks with the releases that meanwhile happend and activated automerge on them.&lt;/p&gt;

&lt;p&gt;This week a lot of new releases came in that needed some work. There was a new DuckDB release. The Python part was dealt with in &lt;a href=&quot;https://github.com/conda-forge/python-duckdb-feedstock/pull/131&quot;&gt;python-duckdb-feedstock#131&lt;/a&gt; whereas for the C++ part, we first finished the work on getting 1.4.0 built in &lt;a href=&quot;https://github.com/conda-forge/duckdb-split-feedstock/pull/42&quot;&gt;duckdb-split-feedstock#42&lt;/a&gt; before we rebased the PR for 1.4.1 in &lt;a href=&quot;https://github.com/conda-forge/duckdb-split-feedstock/pull/43&quot;&gt;duckdb-split-feedstock#43&lt;/a&gt;. This week was also the release of LLVM 21.1.3. I’m trying to also look a bit after those as I’m not so experienced with them yet, but appreciate the existence of a well-maintained compiler toolchain. I set up the tracking issue in &lt;a href=&quot;https://github.com/conda-forge/clang-compiler-activation-feedstock/pull/172&quot;&gt;clang-compiler-activation-feedstock#172&lt;/a&gt; and merged &lt;a href=&quot;https://github.com/conda-forge/llvmdev-feedstock/pull/349&quot;&gt;llvmdev-feedstock#349&lt;/a&gt;. I couldn’t continue on my own, though, as all the outstanding PRs were dependent on &lt;a href=&quot;https://github.com/conda-forge/libcxx-feedstock/pull/250&quot;&gt;libcxx-feedstock#250&lt;/a&gt; to be merged. I’m not a maintainer on that feedstock, though.&lt;/p&gt;

&lt;p&gt;Not only was Python 3.14.0 released this week, but there was also a long list of maintenance releases for the older Python versions. I opened PRs in the python-feedstock for &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/819&quot;&gt;3.13.8&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/815&quot;&gt;3.12.12&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/816&quot;&gt;3.11.14&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/817&quot;&gt;3.10.19&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lately, there have been numerous &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mark as broken&lt;/code&gt; PRs from &lt;a href=&quot;https://github.com/conda-forge/sagemaker-code-editor-feedstock&quot;&gt;sagemaker-code-editor-feedstock&lt;/a&gt;, e.g. &lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1701&quot;&gt;admin-requests#1701&lt;/a&gt;. This led me to review the feedstock and discover serious issues, which I summarised in &lt;a href=&quot;https://github.com/conda-forge/sagemaker-code-editor-feedstock/issues/193&quot;&gt;sagemaker-code-editor-feedstock#193&lt;/a&gt;. Hopefully, they will address these soon so that the packages there have the usual code quality.&lt;/p&gt;
&lt;h2 id=&quot;python-314&quot;&gt;Python 3.14&lt;/h2&gt;
&lt;p&gt;With the Python 3.14 release coming up this week, I did a last push to get some packages built before the “finish line”.  The most major one here was that we manually marked &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow&lt;/code&gt; as done so that the migrator progresses to its dependencies in &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7830&quot;&gt;conda-forge-pinning-feedstock#7830&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To document the progress we made this time with Python 3.14 support on release day, I wrote a blog post in &lt;a href=&quot;https://github.com/conda-forge/conda-forge.github.io/pull/2618&quot;&gt;conda-forge.github.io#2618&lt;/a&gt; that we published on Thursday, two days after the release. As with all rushed things, there were some cosmetic changes afterwards. We did add &lt;a href=&quot;https://github.com/conda-forge/conda-forge.github.io/pull/2620&quot;&gt;a link to migration status early in the text&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/conda-forge.github.io/pull/2621&quot;&gt;the link to the release announcement was missing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I spent some time debugging the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uwsgi&lt;/code&gt; builds in &lt;a href=&quot;https://github.com/conda-forge/uwsgi-feedstock/pull/99&quot;&gt;uwsgi-feedstock#99&lt;/a&gt;, but gave up because I seemed to be doing something wrong there. At least, I got &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib&lt;/code&gt;-dependent packages unblocked by fixing &lt;a href=&quot;https://github.com/conda-forge/jax-feedstock/pull/179&quot;&gt;jax-feedstock#179&lt;/a&gt;. &lt;a href=&quot;https://github.com/conda-forge/sqlalchemy-feedstock/pull/191&quot;&gt;sqlalchemy-feedstock#191&lt;/a&gt; could be merged as this is one of the feedstock, and I was allowed to merge the migration even though I’m not a maintainer. &lt;a href=&quot;https://github.com/conda-forge/py-rattler-build-feedstock/pull/7&quot;&gt;py-rattler-build-feedstock#7&lt;/a&gt; could be closed as it is an ABI3 package and doesn’t need a rebuild.&lt;/p&gt;

&lt;p&gt;Pinged the maintainers on &lt;a href=&quot;https://github.com/conda-forge/fisher-feedstock/pull/33&quot;&gt;fisher-feedstock#33&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/fastbencode-feedstock/pull/9&quot;&gt;fastbencode-feedstock#9&lt;/a&gt;. Also, this week, I was polishing the reports from weeks before. This meant that I also came across some PRs where the maintainers did not react for over a week. I have merged these accordingly.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/numcodecs-feedstock/pull/119&quot;&gt;numcodecs-feedstock#119&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/mariadb-feedstock/pull/19&quot;&gt;mariadb-feedstock#19&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/thrift-feedstock/pull/42&quot;&gt;thrift-feedstock#42&lt;/a&gt; and then rebased &lt;a href=&quot;https://github.com/conda-forge/thrift-feedstock/pull/43&quot;&gt;thrift-feedstock#43&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastbpe-feedstock/pull/18&quot;&gt;fastbpe-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastpath-feedstock/pull/13&quot;&gt;fastpath-feedstock#13&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/future_fstrings-feedstock/pull/21&quot;&gt;future_fstrings-feedstock#21&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cassandra-feedstock/pull/26&quot;&gt;cassandra-feedstock#26&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cyvlfeat-feedstock/pull/22&quot;&gt;cyvlfeat-feedstock#22&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/encor-feedstock/pull/7&quot;&gt;encor-feedstock#7&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/ezdxf-feedstock/pull/80&quot;&gt;ezdxf-feedstock#80&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/focal-stats-feedstock/pull/14&quot;&gt;focal-stats-feedstock#14&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fortls-feedstock/pull/41&quot;&gt;fortls-feedstock#41&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pyreadline-feedstock/pull/17&quot;&gt;pyreadline-feedstock#17&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/doublemetaphone-feedstock/pull/18&quot;&gt;doublemetaphone-feedstock#18&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">This week was the Python 3.14 release, and it will also be the final week where I log my conda-forge work. While it is interesting for me to see what I do work, it is also additional work that keeps me from contributing to conda-forge itself. Still, as a follow-up, I will write at least one more post that reviews the kind of work I have done in the last weeks and how that could be made more efficient.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2025-40: A week in conda-forge</title><link href="https://uwekorn.com/2025/10/16/week40-conda-forge.html" rel="alternate" type="text/html" title="2025-40: A week in conda-forge" /><published>2025-10-16T00:00:00+01:00</published><updated>2025-10-16T00:00:00+01:00</updated><id>https://uwekorn.com/2025/10/16/week40-conda-forge</id><content type="html" xml:base="https://uwekorn.com/2025/10/16/week40-conda-forge.html">&lt;p&gt;This week was the week of PyData Paris and a public holiday in Germany. At the same time, my usual day-to-day work had to continue, so my conda-forge interactions were limited to simple (but many) reviews, fixes and merges. Larger changes have to wait for the next week(s).&lt;/p&gt;

&lt;p&gt;As there was no maintainer response for a week, I merged &lt;a href=&quot;https://github.com/conda-forge/grep-feedstock/pull/17&quot;&gt;grep-feedstock#17&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/lxml-feedstock/pull/105&quot;&gt;lxml-feedstock#105&lt;/a&gt;. As &lt;a href=&quot;https://github.com/conda-forge/r-base-feedstock/pull/386&quot;&gt;r-base-feedstock#386&lt;/a&gt; was merged, we could trigger a re-run (and merge) on &lt;a href=&quot;https://github.com/conda-forge/r-rjava-feedstock/pull/50&quot;&gt;r-rjava-feedstock#50&lt;/a&gt;. After the latest merge, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nodejs&lt;/code&gt; build on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;osx-arm64&lt;/code&gt; no longer fit into the six-hour timeframe on Azure Pipelines, so I started to look into a workaround in &lt;a href=&quot;https://github.com/conda-forge/nodejs-feedstock/pull/416&quot;&gt;nodejs-feedstock#416&lt;/a&gt;. As the initial ideas didn’t lead to a good result, this will need to be reviewed again later. In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nodejs&lt;/code&gt; landscape, &lt;a href=&quot;https://github.com/conda-forge/parceljs-feedstock/pull/54&quot;&gt;parceljs-feedstock#54&lt;/a&gt; was not automerged because an outdated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os_version&lt;/code&gt; broke the build. I cleaned up the feedstock and converted it to a v1 recipe. &lt;a href=&quot;https://github.com/conda-forge/scorecard-feedstock/pull/5&quot;&gt;scorecard-feedstock#5&lt;/a&gt; failed to build with invalid license issues. Here, we needed to manually download the license of a third-party dependency instead of automatically fetching it via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go-licenses&lt;/code&gt;. On the positive side, &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7822&quot;&gt;conda-forge-pinning-feedstock#7822&lt;/a&gt; was a straightforward merge.&lt;/p&gt;

&lt;p&gt;The work on &lt;a href=&quot;https://github.com/conda-forge/jaxlib-feedstock/pull/324&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib 0.7.2&lt;/code&gt;&lt;/a&gt; continued with the problem that the GCC headers can be different between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build_platform&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target_platform&lt;/code&gt;; thus, we needed &lt;a href=&quot;https://github.com/conda-forge/bazel-toolchain-feedstock/pull/26&quot;&gt;bazel-toolchain-feedstock#26&lt;/a&gt; to handle this.&lt;/p&gt;
&lt;h2 id=&quot;python-314&quot;&gt;Python 3.14&lt;/h2&gt;
&lt;p&gt;For the Python 3.14 migration, it was also quantity-over-quality this week as I wanted to ping some maintainers to merge PRs or at least get the clock started on PRs where I could use my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/core&lt;/code&gt; powers to merge after a week of no response.&lt;/p&gt;

&lt;p&gt;During PyData Paris, the currently biggest blocker &lt;a href=&quot;https://github.com/conda-forge/pandas-feedstock/pull/233&quot;&gt;pandas-feedstock#233&lt;/a&gt; was merged after upstream released a Python 3.14-compatible version. I pinged the maintainer on &lt;a href=&quot;https://github.com/conda-forge/fastparquet-feedstock/pull/78&quot;&gt;fastparquet-feedstock#78&lt;/a&gt; directly, as this was the next one to get more nodes in the rebuild graph going.
Sadly, not everything is fixable. For example, &lt;a href=&quot;https://github.com/conda-forge/vowpalwabbit-feedstock/pull/92&quot;&gt;vowpalwabbit-feedstock#92&lt;/a&gt; failed because it doesn’t build as it is not compatible with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fmt&amp;gt;=11&lt;/code&gt;. However, moving the pin manually to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fmt=10&lt;/code&gt; only leads to the following error. Luckily, some easy ones can be directly merged, like &lt;a href=&quot;https://github.com/conda-forge/tabmat-feedstock/pull/56&quot;&gt;tabmat-feedstock#56&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On &lt;a href=&quot;https://github.com/conda-forge/pytorch-cpu-feedstock/pull/420&quot;&gt;pytorch-feedstock#420&lt;/a&gt;, I commented with a link to the upstream issue that we will need to wait for PyTorch 2.10. Still, it might also be possible here that we can backport some patches to the 2.9 release, as this might be simpler/faster than getting the whole of 2.10 building on conda-forge infrastructure.&lt;/p&gt;

&lt;p&gt;In the list of larger nodes in the Python 3.14 graph, we also had &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pywinpty&lt;/code&gt;. As the PR was failing on the current version, I first tried to upgrade to the latest one in &lt;a href=&quot;https://github.com/conda-forge/pywinpty-feedstock/pull/64&quot;&gt;pywinpty-feedstock#64&lt;/a&gt;. Still, once I found out that this would require nuget and Windows Terminal to be build from source, I moved on an fixed &lt;a href=&quot;https://github.com/conda-forge/pywinpty-feedstock/pull/65&quot;&gt;pywinpty-feedstock#65&lt;/a&gt; by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1&lt;/code&gt; so that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maturin&lt;/code&gt; builds for the new Python version.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/conda-forge/numcodecs-feedstock/pull/119&quot;&gt;numcodecs-feedstock#119&lt;/a&gt; initially failed because of a missing Python 3.14 build for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;coverage&lt;/code&gt;. After a rerender of the feedstock, the build now passes, and thus I requested a review from the maintainers. This was also the case for &lt;a href=&quot;https://github.com/conda-forge/pyfftw-feedstock/pull/70&quot;&gt;pyfftw-feedstock#70&lt;/a&gt;. Similarly, I also asked a rerender for &lt;a href=&quot;https://github.com/conda-forge/framel-feedstock/pull/44&quot;&gt;framel-feedstock#44&lt;/a&gt;. Sadly, in this case, Windows kept failing with MinGW compiler issues. These were solved by removing some old workarounds from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda_build_config.yaml&lt;/code&gt;. The build then passed, but framel’s unit tests failed, and I moved on for now. In &lt;a href=&quot;https://github.com/conda-forge/srsly-feedstock/pull/56&quot;&gt;srsly-feedstock#56&lt;/a&gt; , the rerender revealed an upper pin in the package for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python&amp;lt;=3.13&lt;/code&gt;. We concluded here to wait for a new release. As the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;thrift-feedstock&lt;/code&gt; looked a bit abandoned, I revived the version update in &lt;a href=&quot;https://github.com/conda-forge/thrift-feedstock/pull/42&quot;&gt;thrift-feedstock#42&lt;/a&gt; and converted this to a v1 recipe to tackle the Python 3.14 migration afterwards.&lt;/p&gt;

&lt;p&gt;There were several more small fixes I did, that I’m only summarising as bullets here:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Rebased &lt;a href=&quot;https://github.com/conda-forge/numexpr-feedstock/pull/75&quot;&gt;numexpr-feedstock#75&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/bottleneck-feedstock/pull/61&quot;&gt;bottleneck-feedstock#61&lt;/a&gt; as both had new releases. In both cases, the build then passed.&lt;/li&gt;
  &lt;li&gt;Requested a rerender on &lt;a href=&quot;https://github.com/conda-forge/argon2-cffi-bindings-feedstock/pull/12&quot;&gt;argon2-cffi-bindings-feedstock#12&lt;/a&gt;; the builds then passed.&lt;/li&gt;
  &lt;li&gt;After the rerender on &lt;a href=&quot;https://github.com/conda-forge/mariadb-feedstock/pull/19&quot;&gt;mariadb-feedstock#19&lt;/a&gt;, the builds sadly failed on Windows. This required linking to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zlib&lt;/code&gt; to get them to pass.&lt;/li&gt;
  &lt;li&gt;Created &lt;a href=&quot;https://github.com/conda-forge/sip-feedstock/pull/100&quot;&gt;sip-feedstock#100&lt;/a&gt; to build &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sip&lt;/code&gt; for Python 3.14 for this (older) release to move &lt;a href=&quot;https://github.com/conda-forge/pyqt-feedstock/pull/159&quot;&gt;pyqt-feedstock#159&lt;/a&gt; forward&lt;/li&gt;
  &lt;li&gt;Updated &lt;a href=&quot;https://github.com/conda-forge/onnx-feedstock/pull/134&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onnx&lt;/code&gt; to 1.19.0&lt;/a&gt; first before attempting the Python 3.14 migration in &lt;a href=&quot;https://github.com/conda-forge/onnx-feedstock/pull/135&quot;&gt;onnx-feedstock#135&lt;/a&gt;. This also needed an older protobuf version rebuild in &lt;a href=&quot;https://github.com/conda-forge/protobuf-feedstock/pull/255&quot;&gt;protobuf-feedstock#255&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Similarly to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onnx&lt;/code&gt;, &lt;a href=&quot;https://github.com/conda-forge/grpc-cpp-feedstock/pull/414&quot;&gt;grpc-cpp-feedstock#414&lt;/a&gt; also needed the older &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;protobuf&lt;/code&gt; version to be rebuilt first before it could move on. At the same time, we had to exclude some more end2end tests from CI as the runtime exceed our Azure timelimit.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/kornia-rs-feedstock/pull/22&quot;&gt;kornia-rs-feedstock#22&lt;/a&gt; passed, but it had an explicit skip for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;py&amp;gt;=313&lt;/code&gt;. After removing this, we needed to set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maturin&lt;/code&gt; into ABI3 compatability mode to produce a wheel for Python 3.14&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-feedstock/pull/274&quot;&gt;conda-feedstock#274&lt;/a&gt; needed a rebase after a PR to main was merged, but it is still running into a cyclic dependency with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-libmamba-solver&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Requested rerender for &lt;a href=&quot;https://github.com/conda-forge/python-rapidjson-feedstock/pull/70&quot;&gt;python-rapidjon-feedstock#70&lt;/a&gt; as build were failing but logs were no longer visible. Sadly the Python 3.14 builds here fail for Python 3.14 in relation to some refcount changes (similar to what was required to be fixed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pyreadline-feedstock/pull/17&quot;&gt;pyreadline-feedstock#17&lt;/a&gt; required the addition of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setuptools&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host&lt;/code&gt; to become green&lt;/li&gt;
  &lt;li&gt;In contrast to most &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib&lt;/code&gt; work, &lt;a href=&quot;https://github.com/conda-forge/jaxlib-feedstock/pull/325&quot;&gt;jaxlib-feedstock#325&lt;/a&gt; passed directly and we merged only building for Python 3.14 and reverted that with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[ci skip]&lt;/code&gt; on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/python-duckdb-feedstock/pull/130&quot;&gt;python-duckdb-feedstock#130&lt;/a&gt; failed with deprecation warnings that triggered test failures. After updating to a new version in &lt;a href=&quot;https://github.com/conda-forge/python-duckdb-feedstock/pull/129&quot;&gt;python-duckdb-feedstock#129&lt;/a&gt;, the previous PR also passed.&lt;/li&gt;
  &lt;li&gt;We could close &lt;a href=&quot;https://github.com/conda-forge/gz-gui-feedstock/pull/71&quot;&gt;gz-gui-feedstock#71&lt;/a&gt; simply as this is an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;abi3&lt;/code&gt; package and doesn’t need a rebuild.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the one week reaction period passed, I merged the following feedstock due to inactivity using my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/core&lt;/code&gt; powers:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastdtw-feedstock/pull/18&quot;&gt;fastdtw-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/tensorboard-data-server-feedstock/pull/23&quot;&gt;tensorboard-data-server-feedstock#23&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/xtensor-python-feedstock/pull/98&quot;&gt;xtensor-python-feedstock#98&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/setproctitle-feedstock/pull/38&quot;&gt;setproctitle-feedstock#38&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/gunicorn-feedstock/pull/43&quot;&gt;gunicorn-feedstock#43&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/python-marisa-trie-feedstock/pull/42&quot;&gt;python-maria-trie-feedstock#42&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/audioread-feedstock/pull/33&quot;&gt;audioread-feedstock#33&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pycryptodome-feedstock/pull/65&quot;&gt;pycryptodome-feedstock#65&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/xrootd-feedstock/pull/109&quot;&gt;xrootd-feedstock#109&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These feedstocks were merged because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ocepaf&lt;/code&gt; gave me the 👍 to merge green Python 3.14 PRs where he is a maintainer:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pyqtwebkit-feedstock/pull/25&quot;&gt;pyqtwebkit-feedstock#25&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pyrsistent-feedstock/pull/47&quot;&gt;pyrsistent-feedstock#47&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/numexpr-feedstock/pull/75&quot;&gt;numexpr-feedstock#75&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were also several PRs where the CI passed, so that I pinged the maintainers to make them aware:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/casa_formats_io-feedstock/pull/14&quot;&gt;case_formats_io-feedstock#14&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/doublemetaphone-feedstock/pull/18&quot;&gt;doublemetaphone-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/openmm-feedstock/pull/164&quot;&gt;openmm-feedstock#164&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/mdtraj-feedstock/pull/82&quot;&gt;mdtraj-feedstock#82&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/wandb-feedstock/pull/163&quot;&gt;wandb-feedstock#163&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/dbus-python-feedstock/pull/27&quot;&gt;dbus-python-feedstock#27&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cppe-feedstock/pull/28&quot;&gt;cppe-feedstock#28&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/kahip-feedstock/pull/25&quot;&gt;kahip-feedstock#25&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/scikit-sparse-feedstock/pull/53&quot;&gt;scikit-sparse-feedstock#53&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/simpleitk-feedstock/pull/46&quot;&gt;simpleitk-feedstock#46&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/smqtk-dataprovider-feedstock/pull/4&quot;&gt;smqtk-dataprovider-feedstock#4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/traits-feedstock/pull/46&quot;&gt;traits-feedstock#46&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pybtex-docutils-feedstock/pull/22&quot;&gt;pybtex-docutils-feedstock#22&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pycocotools-feedstock/pull/43&quot;&gt;pycocotools-feedstock#43&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pygraphviz-feedstock/pull/47&quot;&gt;pygraphviz-feedstock#47&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/psyplot-feedstock/pull/33&quot;&gt;psyplot-feedstock#33&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/assist-feedstock/pull/18&quot;&gt;assist-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cmarkgfm-feedstock/pull/36&quot;&gt;cmarkgfm-feedstock#36&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/partsegcore-compiled-backend-feedstock/pull/28&quot;&gt;partsegcore-compiled-backend-feedstock#28&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/memory-allocator-feedstock/pull/20&quot;&gt;memory-allocator-feedstock#20&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pemja-feedstock/pull/20&quot;&gt;pemja-feedstock#20&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/mmh3-feedstock/pull/27&quot;&gt;mmh3-feedstock#27&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/njoy2016-feedstock/pull/20&quot;&gt;njoy2016-feedstock#20&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/opentsne-feedstock/pull/54&quot;&gt;opentsne-feedstock#54&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/opentracing-feedstock/pull/20&quot;&gt;opentracing-feedstock#20&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/promise-feedstock/pull/26&quot;&gt;promise-feedstock#26&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pycbf-feedstock/pull/18&quot;&gt;pycbf-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pylsqpack-feedstock/pull/9&quot;&gt;pylsqpack-feedstock#9&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pymdi-feedstock/pull/87&quot;&gt;pymdi-feedstock#87&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/python-box-feedstock/pull/57&quot;&gt;python-box-feedstock#57&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pyvinecopulib-feedstock/pull/13&quot;&gt;pyvinecopulib-feedstock#13&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/qutip-feedstock/pull/109&quot;&gt;qutip-feedstock#109&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/rpm-tools-feedstock/pull/45&quot;&gt;rpm-tools-feedstock#45&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">This week was the week of PyData Paris and a public holiday in Germany. At the same time, my usual day-to-day work had to continue, so my conda-forge interactions were limited to simple (but many) reviews, fixes and merges. Larger changes have to wait for the next week(s).</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2025-39: A week in conda-forge</title><link href="https://uwekorn.com/2025/10/14/week39-conda-forge.html" rel="alternate" type="text/html" title="2025-39: A week in conda-forge" /><published>2025-10-14T00:00:00+01:00</published><updated>2025-10-14T00:00:00+01:00</updated><id>https://uwekorn.com/2025/10/14/week39-conda-forge</id><content type="html" xml:base="https://uwekorn.com/2025/10/14/week39-conda-forge.html">&lt;p&gt;In the third week of reporting on my conda-forge work, you will see how the large number of contributions happens quickly. As we’re getting closer to the Python 3.14 release, I spent some time bringing that forward.&lt;/p&gt;

&lt;p&gt;The week started with a &lt;a href=&quot;https://github.com/conda-forge/rust-feedstock/pull/257&quot;&gt;rust-dev update&lt;/a&gt;. These updates are based on a script that regenerates a section of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta.yaml&lt;/code&gt;, but the PRs themselves are not yet automated. In the same weekly cleaning session, I manually closed the &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7802&quot;&gt;close aws_c_202509 migration&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7803&quot;&gt;aws_crt_cpp0343 migration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Last week, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; migration progressed. Unfortunately, this also meant some breakage in a few places. I spent some time debugging &lt;a href=&quot;https://github.com/conda-forge/lxml-feedstock/pull/105&quot;&gt;lxml-feedstock#105&lt;/a&gt;, where we need to pin to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2-16 2.14.x&lt;/code&gt;. This is much stricter than the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;run_exports&lt;/code&gt; of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; packages enforces. In the end, this was not an unstable ABI but a change in the build that occurred in the latest minor release. While the PR for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ibm_db&lt;/code&gt; passed, it sadly resulted in failing packages as it picked the system &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; and not the new conda-forge version. Thus, we marked these builds as broken in &lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1672&quot;&gt;admin-requests#1672&lt;/a&gt;. We fixed the linkages in &lt;a href=&quot;https://github.com/conda-forge/ibm_db-feedstock/pull/87&quot;&gt;ibm_db-feedstock#87&lt;/a&gt; by pinning to the old version.&lt;/p&gt;

&lt;p&gt;As I’m a maintainer (also user) of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcre2-feedstock&lt;/code&gt;, I spent a bit of time reviewing the PRs that were still open on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcre2 10.46&lt;/code&gt; migration:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Pinged the maintainer on &lt;a href=&quot;https://github.com/conda-forge/deepsearch-glm-feedstock/pull/8&quot;&gt;deepsearch-glm-feedstock#8&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/lighttpd-feedstock/pull/45&quot;&gt;lighttpd-feedstock#45&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/ugrep-feedstock/pull/15&quot;&gt;ugrep-feedstock#15&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Triggered a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bot-rerun&lt;/code&gt; on &lt;a href=&quot;https://github.com/conda-forge/htcondor-feedstock/pull/316&quot;&gt;htcondor-feedstock#316&lt;/a&gt; so that the PR is rebased on the latest main. The new PR &lt;a href=&quot;https://github.com/conda-forge/htcondor-feedstock/pull/325&quot;&gt;htcondor-feedstock#325&lt;/a&gt; was then swiftly merged by the maintainers.&lt;/li&gt;
  &lt;li&gt;Similarly, &lt;a href=&quot;https://github.com/conda-forge/r-rjava-feedstock/pull/48&quot;&gt;r-rjava-feedstock#48&lt;/a&gt; needed a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bot-rerun&lt;/code&gt; and first the merge of &lt;a href=&quot;https://github.com/conda-forge/r-base-feedstock/pull/386&quot;&gt;r-base-feedstock#383&lt;/a&gt; so that the older R release also could be installed with the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcre2&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Ignored the status of &lt;a href=&quot;https://github.com/conda-forge/julia-feedstock/pull/297&quot;&gt;julia-feedstock#297&lt;/a&gt;, as the whole feedstock seems abandoned&lt;/li&gt;
  &lt;li&gt;Fixing &lt;a href=&quot;https://github.com/conda-forge/grep-feedstock/pull/17&quot;&gt;grep-feedstock#17&lt;/a&gt; was a bit trickier, as it needed the new release and still kept failing, as the cross-compiled tests don’t work because of a path issue. Additionally, some behaviour changed recently on macOS so more integrated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gnulib&lt;/code&gt; tests needed to be skipped. This was fixed by backporting the fixes from &lt;a href=&quot;https://github.com/coreutils/gnulib/commit/ccb60ee9ab0205cfd23066bd520d1a0c9c7a0a76&quot;&gt;gnulib-ccb60ee9&lt;/a&gt; and &lt;a href=&quot;https://github.com/coreutils/gnulib/commit/b49212bd6ce6182d95af45d490d4de9f84bcc223&quot;&gt;gnulib-b49212bd&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;On &lt;a href=&quot;https://github.com/conda-forge/nginx-feedstock/pull/96&quot;&gt;nginx-feedstock#96&lt;/a&gt;, I made some progress by fixing the missing dependency on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxcrypt&lt;/code&gt; on newer Linux versions. Still, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;configure&lt;/code&gt; fails with an error on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxslt&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/uwsgi-feedstock/pull/100&quot;&gt;uwsgi#100&lt;/a&gt; fails due to bytecode mismatches in LTO code. Thus, it needs a rebuild of Python with the latest version of GCC. As Python 3.13 was already rebuilt, I made &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/815&quot;&gt;python-feedstock#815&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/816&quot;&gt;python-feedstock#816&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/817&quot;&gt;python-feedstock#817&lt;/a&gt; for Python 3.10-3.12.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, I made minor fixes in &lt;a href=&quot;https://github.com/conda-forge/librsvg-feedstock/pull/129&quot;&gt;librsvg-feedstock#129&lt;/a&gt; and reviewed &lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1674&quot;&gt;admin-requests#1674&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/sqlglotrs-feedstock/pull/33&quot;&gt;sqlglotrs-feedstock#33&lt;/a&gt;. As some colleagues required specific versions of Netbird, I contributed that via &lt;a href=&quot;https://github.com/conda-forge/staged-recipes/pull/31096&quot;&gt;staged-recipes#31096&lt;/a&gt; and added &lt;a href=&quot;https://github.com/conda-forge/netbird-feedstock/pull/1&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;linux-aarch64&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;linux-ppc64le&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;osx-arm64&lt;/code&gt;&lt;/a&gt; immediately afterwards.&lt;/p&gt;

&lt;p&gt;As &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib 0.7.1&lt;/code&gt; was merged, it was time to continue work on &lt;a href=&quot;https://github.com/conda-forge/jaxlib-feedstock/pull/324&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib v0.7.2&lt;/code&gt;&lt;/a&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@h-vetinari&lt;/code&gt; already started working on this, so it wasn’t a fresh start. As part of the new version, I updated the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absl&lt;/code&gt; third-party dependency by adding new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;log&lt;/code&gt; targets. We could also drop the GCC 15 fixes we did for 0.7.1, as they were already integrated into this release. Sadly, the compilation now takes longer on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;osx-64&lt;/code&gt;, and to get it below the six-hour limit, I changed the oneDNN build from the bundled version to linking against the conda-forge package.
Meanwhile, we also attempted to migrate to CUDA 13. This sadly failed, as not even the latest Clang 21 release can build CUDA 13 device code. Still, I used the chance to contribute Clang 21 support to &lt;a href=&quot;https://github.com/google-ml-infra/rules_ml_toolchain/pull/88&quot;&gt;google-ml-infra/rules_ml_toolchain#88&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There were again several (trivial) merges I did this week using my maintainer duties or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge/core&lt;/code&gt; powers:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7772&quot;&gt;conda-forge-pinning-feedstock#7772&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7736&quot;&gt;conda-forge-pinning-feedstock#7736&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge.github.io/pull/2603&quot;&gt;conda-forge.github.io#2603&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/snowflake-connector-python-feedstock/pull/197&quot;&gt;snowflake-connector-python-feedstock#197&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cargo-deny-feedstock/pull/4&quot;&gt;cargo-deny-feedstock#4&lt;/a&gt; (and enabled automerge)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/aws-sdk-cpp-feedstock/pull/971&quot;&gt;aws-sdk-cpp-feedstock#971&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1664&quot;&gt;admin-requests#1664&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/libgit2-feedstock/pull/86&quot;&gt;libgit2-feedstock#86&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Closed &lt;a href=&quot;https://github.com/conda-forge/aws-sdk-cpp-feedstock/pull/972&quot;&gt;aws-sdk-cpp#972&lt;/a&gt; as rebuilds are costly&lt;/li&gt;
  &lt;li&gt;Merged &lt;a href=&quot;https://github.com/conda-forge/staged-recipes/pull/31099&quot;&gt;staged-recipes#31099&lt;/a&gt; for a colleague&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fisher-feedstock/pull/32&quot;&gt;fisher-feedstock#32&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/seqan-library-feedstock/pull/12&quot;&gt;seqan-library-feedstock#12&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/gdk-pixbuf-feedstock/pull/57&quot;&gt;gdk-pixbuf-feedstock#57&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/flock-feedstock/pull/7&quot;&gt;flock-feedstock#7&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/tree-sitter-sql-feedstock/pull/6&quot;&gt;tree-sitter-sql-feedstock#6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7809&quot;&gt;conda-forge-pinning-feedstock#7809&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Triggered cirun and then merged &lt;a href=&quot;https://github.com/conda-forge/nodejs-feedstock/pull/415&quot;&gt;nodejs-feedstock#415&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1673&quot;&gt;admin-requests#1673&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7793&quot;&gt;conda-forge-pinning-feedstock#7793&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/psqlodbc-feedstock/pull/15&quot;&gt;psqlodbc-feedstock#15&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Due to network issues on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apache.org&lt;/code&gt; side, we needed to retrigger CI before we could merge &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1861&quot;&gt;arrow-cpp-feedstock#1861&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1863&quot;&gt;arrow-cpp-feedstock#1863&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1862&quot;&gt;arrow-cpp-feedstock#1862&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1864&quot;&gt;arrow-cpp-feedstock#1864&lt;/a&gt;
    &lt;h2 id=&quot;python-314&quot;&gt;Python 3.14&lt;/h2&gt;
    &lt;p&gt;This week, I started my mini-sprint to bring the Python 3.14 migration forward so we will have a good release-day availability.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a first step, I manually opened &lt;a href=&quot;https://github.com/conda-forge/pymsbuild-feedstock/pull/25&quot;&gt;pymsbuild-feedstock#25&lt;/a&gt;, as the bot did not open a migration PR for it, but already had ones for packages depending on it. Similarly, &lt;a href=&quot;https://github.com/conda-forge/conda-feedstock/pull/274&quot;&gt;conda-feedstock#274&lt;/a&gt; failed because it needs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mamba&lt;/code&gt; to migrate first.  We could close &lt;a href=&quot;https://github.com/conda-forge/futures-feedstock/pull/17&quot;&gt;futures-feedstock#17&lt;/a&gt; , as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;futures&lt;/code&gt; is a Python 2.x-only package. I requested its archival in &lt;a href=&quot;https://github.com/conda-forge/admin-requests/pull/1671&quot;&gt;admin-requests#1671&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then there was a round of PRs that could be merged, because they either were part of an abandoned feedstock or the maintainer had already approved it: &lt;a href=&quot;https://github.com/conda-forge/cchardet-feedstock/pull/24&quot;&gt;cchardet-feedstock#24&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/flt-feedstock/pull/14&quot;&gt;flt-feedstock#14&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/fake-factory-feedstock/pull/26&quot;&gt;fake-factory-feedstock#26&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For &lt;a href=&quot;https://github.com/conda-forge/fill-voids-feedstock/pull/6&quot;&gt;fill-voids-feedstock#6&lt;/a&gt; and &lt;a href=&quot;https://github.com/conda-forge/fisher-feedstock/pull/30&quot;&gt;fisher-feedstock#30&lt;/a&gt;, I triggered a bot rerun because they looked good but had conflicts that prevented their direct merge.&lt;/p&gt;

&lt;p&gt;Some PRs could easily be fixed by adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setuptools&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host&lt;/code&gt;. Since Python 3.13, conda-forge no longer ships it as an implicit dependency of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip&lt;/code&gt; and thus it often breaks the build for some packages on these newer Python releases. I applied it to the following feedstocks and pinged the maintainers once the CI was green: &lt;a href=&quot;https://github.com/conda-forge/fastbpe-feedstock/pull/18&quot;&gt;fastbpe-feedstock#18&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/fastpath-feedstock/pull/13&quot;&gt;fastpath-feedstock#13&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/future_fstrings-feedstock/pull/21&quot;&gt;future_fstrings-feedstock#21&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, there is a long list of feedstocks where I reviewed the PR and pinged the maintainers as the builds looked fine:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/audioread-feedstock/pull/33&quot;&gt;audioread-feedstock#33&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/clarabel-feedstock/pull/16&quot;&gt;clarabel-feedstock#16&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/ephem-feedstock/pull/40&quot;&gt;ephem-feedstock#40&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pycifrw-feedstock/pull/32&quot;&gt;pycifrw-feedstock#32&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/rebound-feedstock/pull/116&quot;&gt;rebound-feedstock#116&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/pathlib2-feedstock/pull/24&quot;&gt;pathlob2-feedstock#24&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/coreforecast-feedstock/pull/23&quot;&gt;coreforecast-feedstock#23&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/ezc3d-feedstock/pull/97&quot;&gt;ezc3d-feedstock#97&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/gstools-cython-feedstock/pull/6&quot;&gt;gstools-cython-feedstock#6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/bitarray-feedstock/pull/111&quot;&gt;bitarray-feedstock#111&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/memray-feedstock/pull/52&quot;&gt;memray-feedstock#52&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cassandra-feedstock/pull/26&quot;&gt;cassandra-feedstock#26&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/cyvlfeat-feedstock/pull/22&quot;&gt;cyvlfeat-feedstock#22&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/encor-feedstock/pull/7&quot;&gt;encor-feedstock#7&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/ezdxf-feedstock/pull/80&quot;&gt;ezdxf-feedstock#80&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastbencode-feedstock/pull/7&quot;&gt;fastbencode-feedstock#7&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastdtw-feedstock/pull/18&quot;&gt;fastdtw-feedstock#18&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fastscapelib-f2py-feedstock/pull/30&quot;&gt;fastscapelib-f2py-feedstock#30&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/filepattern-feedstock/pull/19&quot;&gt;filepattern-feedstock#19&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fimex-feedstock/pull/91&quot;&gt;fimex-feedstock#91&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/focal-stats-feedstock/pull/14&quot;&gt;focal-stats-feedstock#14&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/fortls-feedstock/pull/41&quot;&gt;fortls-feedstock#41&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">In the third week of reporting on my conda-forge work, you will see how the large number of contributions happens quickly. As we’re getting closer to the Python 3.14 release, I spent some time bringing that forward.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2025-38: A week in conda-forge</title><link href="https://uwekorn.com/2025/10/12/week38-conda-forge.html" rel="alternate" type="text/html" title="2025-38: A week in conda-forge" /><published>2025-10-12T00:00:00+01:00</published><updated>2025-10-12T00:00:00+01:00</updated><id>https://uwekorn.com/2025/10/12/week38-conda-forge</id><content type="html" xml:base="https://uwekorn.com/2025/10/12/week38-conda-forge.html">&lt;p&gt;To continue to give you a glance into my conda-forge work, we’re continuing with the second week of reporting. This week was a bit leaner on my activities here as I spend my time on preparing my &lt;a href=&quot;https://uwekorn.com/talks.html&quot;&gt;PyData Paris 2025&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Still, the talk also provided the need for one PR on conda-forge: I migrated the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;polars-feedstock&lt;/code&gt; to &lt;a href=&quot;https://github.com/conda-forge/polars-feedstock/pull/342&quot;&gt;make it &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cargo-auditable&lt;/code&gt;&lt;/a&gt;. This has been useful as an example in my talk as polars statically links a huge number of Rust dependencies. Thus, it is a good case to highlight the existence of Phantom Dependencies (dependencies you have in your environment that your package manager doesn’t list/is aware of).&lt;/p&gt;

&lt;p&gt;Later this week, I continued working on the &lt;a href=&quot;https://github.com/conda-forge/jaxlib-feedstock/pull/321&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jaxlib v0.7.1&lt;/code&gt;&lt;/a&gt; PR. Here, we needed to move to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clang&lt;/code&gt; as the default compiler on all platforms. This meant that we also needed to adjust the &lt;a href=&quot;https://github.com/conda-forge/bazel-toolchain-feedstock/pull/25&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bazel-toolchain&lt;/code&gt; feedstock&lt;/a&gt; to also handle this. Furthermore, to work around some build issues, we had to update the bundled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gloo&lt;/code&gt; version and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;abseil-cpp&lt;/code&gt; dependency that we pull in as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda&lt;/code&gt; dependency. Once these dependencies were updated, we got a linker error with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;abseil-cpp&lt;/code&gt; on Linux. The linker error was for a missing symbol named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_ZN4absl12lts_202505124CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEETnNSt9enable_ifIXsr3std7is_sameIT_S8_EE5valueEiE4typeELi0EEEOSA_&lt;/code&gt;. The symbol actually existed in the source code, but was encoded in the binary as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_ZN4absl12lts_202505124CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELi0EEEOT_&lt;/code&gt;. The noticeable difference here is that the first contains the condition &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;std::is_same&lt;/code&gt;, whereas the latter doesn’t. As this only happens on Linux, the obvious culprit here is the difference in compilers. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;abseil-cpp&lt;/code&gt; itself is built using conda-forge’s standard compiler on Linux (GCC), whereas we moved to clang.
Looking at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clang&lt;/code&gt;’s issue tracker, there is &lt;a href=&quot;https://github.com/llvm/llvm-project/issues/85656&quot;&gt;llvm-project#85656&lt;/a&gt;.
This reveals that adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-fclang-abi-compat=17&lt;/code&gt;  as a compiler/linker flag solves the issues by falling back to the old symbol naming behaviour.&lt;/p&gt;

&lt;p&gt;As part of the move to clang, we replaced not only GCC but also &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nvcc&lt;/code&gt; for compiling CUDA device code. This sadly led to one compilation error for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__glibcxx_requires_subscript&lt;/code&gt;, which was appearing in device code, but had no respective device implementation:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;In file included from /home/ubuntu/.pixi/envs/conda-build/conda-bld/jaxlib_1758038148038/_build_env/bin/../lib/gcc/x86_64-conda-linux-gnu/15.1.0/../../../gcc/x86_64-conda-linux-gnu/15.1.0/include/c++/functional:67:
/home/ubuntu/.pixi/envs/conda-build/conda-bld/jaxlib_1758038148038/_build_env/bin/../lib/gcc/x86_64-conda-linux-gnu/15.1.0/../../../gcc/x86_64-conda-linux-gnu/15.1.0/include/c++/array:210:2: error: reference to __host__ function '__glibcxx_assert_fail' in __host__ __device__ function
  210 |         __glibcxx_requires_subscript(__n);
      |         ^
/home/ubuntu/.pixi/envs/conda-build/conda-bld/jaxlib_1758038148038/_build_env/bin/../lib/gcc/x86_64-conda-linux-gnu/15.1.0/../../../gcc/x86_64-conda-linux-gnu/15.1.0/include/c++/debug/assertions.h:39:3: note: expanded from macro '__glibcxx_requires_subscript'
   39 |   __glibcxx_assert(_N &amp;lt; this-&amp;gt;size())
      |   ^
/home/ubuntu/.pixi/envs/conda-build/conda-bld/jaxlib_1758038148038/_build_env/bin/../lib/gcc/x86_64-conda-linux-gnu/15.1.0/../../../gcc/x86_64-conda-linux-gnu/15.1.0/include/c++//x86_64-conda-linux-gnu/bits/c++config.h:658:12: note: expanded from macro '__glibcxx_assert'
  658 |       std::__glibcxx_assert_fail();                                     \
      |            ^
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In GCC’s and Clang’s issue trackers we find similar-looking resources: &lt;a href=&quot;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115740&quot;&gt;gcc#115740&lt;/a&gt;, &lt;a href=&quot;https://github.com/llvm/llvm-project/issues/95183&quot;&gt;llvm#95183&lt;/a&gt;, and &lt;a href=&quot;https://github.com/llvm/llvm-project/issues/49727&quot;&gt;llvm#49727&lt;/a&gt;. The fix for that has been merged in &lt;a href=&quot;https://github.com/llvm/llvm-project/pull/136133&quot;&gt;llvm#136133&lt;/a&gt;. I have tried to apply that fix in &lt;a href=&quot;https://github.com/conda-forge/clangdev-feedstock/pull/383&quot;&gt;clangdev-feedstock#383&lt;/a&gt;, but sadly that was insufficient as raised in &lt;a href=&quot;https://github.com/conda-forge/clangdev-feedstock/issues/384&quot;&gt;clangdev-feedstock#384&lt;/a&gt;. The correct fix then landed in &lt;a href=&quot;https://github.com/conda-forge/clangdev-feedstock/pull/385&quot;&gt;clangdev-feedstock#385&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;While my plan is to get to more in the Python 3.14 migration in the coming weeks, this week the work solely focused on kicking off the build for &lt;a href=&quot;https://github.com/conda-forge/python-feedstock/pull/814&quot;&gt;python 3.14.0rc3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sadly, I ran into a bit of a mess with the AWS C stack this week. I needed to issue &lt;a href=&quot;https://github.com/conda-forge/aws-sdk-cpp-feedstock/pull/970&quot;&gt;aws-sdk-cpp-feedstock#970&lt;/a&gt; manually as &lt;a href=&quot;https://github.com/conda-forge/aws-sdk-cpp-feedstock/pull/969&quot;&gt;aws-sdk-cpp-feedstock#969&lt;/a&gt; was closed, but the bot did not retry it. Instead, the bot issued PRs to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arrow-cpp-feedstock&lt;/code&gt; directly (see &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1854&quot;&gt;arrow-cpp-feedstock#1854&lt;/a&gt;). This led, in general, to a messy situation with PRs in the arrow-cpp repository.
At least &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1855&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[main] Rebuild for aws-c* (Sep '25)&lt;/code&gt;&lt;/a&gt; seemed to have worked fine, but all arrow versions there were already in the archive (i.e. all except the latest) had some download issues, and the PRs needed to be restarted. Restarting some failed jobs in &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1856&quot;&gt;[20.x] Rebuild for aws-c* (Sep ‘25)&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1857&quot;&gt;[19.x] Rebuild for aws-c* (Sep ‘25)&lt;/a&gt;, and &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1858&quot;&gt;[18.x] Rebuild for aws-c* (Sep ‘25)&lt;/a&gt; made them pass again. Afterwards, we needed to rebase the PRs (&lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1860&quot;&gt;main&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1852&quot;&gt;20.x&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1853&quot;&gt;19.x&lt;/a&gt;, &lt;a href=&quot;https://github.com/conda-forge/arrow-cpp-feedstock/pull/1854&quot;&gt;18.x&lt;/a&gt;) for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-crt-cpp 0.34.3&lt;/code&gt; migration.&lt;/p&gt;

&lt;p&gt;This week, there were also numerous small tasks I engaged in:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The build for &lt;a href=&quot;https://github.com/conda-forge/zstandard-feedstock/pull/69&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zstandard v0.25.0&lt;/code&gt;&lt;/a&gt; was failing due to a missing dependency on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;packaging&lt;/code&gt; during the build. While fixing this, I also converted it to a v1 recipe.&lt;/li&gt;
  &lt;li&gt;There was a contribution that added &lt;a href=&quot;https://github.com/conda-forge/cargo-auditable-feedstock/pull/4&quot;&gt;ppc64le support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cargo-auditable&lt;/code&gt;&lt;/a&gt;. The contributor first used emulation, but switched to cross-compilation on request, which made the builds much faster.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@isuruf&lt;/code&gt; fixed the &lt;a href=&quot;https://github.com/conda-forge/msitools-feedstock/pull/12#event-19709650378&quot;&gt;libxml2 migration for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msitools&lt;/code&gt;&lt;/a&gt;, and during my review, I realised that we were still using the old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gettext&lt;/code&gt; outputs in the feedstock. Thus, I submitted &lt;a href=&quot;https://github.com/conda-forge/msitools-feedstock/pull/14&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Use new gettext outputs; convert to rattler&lt;/code&gt;&lt;/a&gt;. Afterwards, I also bumped the version to &lt;a href=&quot;https://github.com/conda-forge/msitools-feedstock/pull/15&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msitools 0.106&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://github.com/conda-forge/librsvg-feedstock/pull/128&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2 rebuild for librsvg&lt;/code&gt;&lt;/a&gt; was failing with an overlinking error.&lt;/li&gt;
  &lt;li&gt;Supported people on &lt;a href=&quot;https://github.com/conda-forge/dynare-preprocessor-feedstock/pull/7&quot;&gt;dynare-preprocessor-feedstock#7&lt;/a&gt; in their effort to build for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;osx-64&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Commented on &lt;a href=&quot;https://github.com/conda-forge/fmt-feedstock/pull/67#issuecomment-3305642482&quot;&gt;fmt-feedstock#67&lt;/a&gt; that we should not wait too long for things to start&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/vega-lite-cli-feedstock/pull/41&quot;&gt;vega-lite-cli-feedstock#41&lt;/a&gt; did not build as there was an outdated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os_version&lt;/code&gt; section in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda-forge.yml&lt;/code&gt;. Thus, I took the opportunity and moved it to a v1 recipe. The sames fixes were also required to get &lt;a href=&quot;https://github.com/conda-forge/vega-cli-feedstock/pull/44&quot;&gt;vega-cli-feedstock#44&lt;/a&gt; to work.&lt;/li&gt;
  &lt;li&gt;This week, it was also time for &lt;a href=&quot;https://github.com/conda-forge/rust-feedstock/pull/255&quot;&gt;a rust-nightly update again&lt;/a&gt;. At the same time, we also merged &lt;a href=&quot;https://github.com/conda-forge/rust-feedstock/pull/256&quot;&gt;rust v1.90.0&lt;/a&gt; and then manually created the &lt;a href=&quot;https://github.com/conda-forge/rust-activation-feedstock/pull/84&quot;&gt;activation upto to main 1.90; dev 1.92&lt;/a&gt; to enable feedstocks to use the new compilers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And finally, the list of pull requests where I only did a review and merged them, but no real interaction:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/universal-ctags-feedstock/pull/240&quot;&gt;Rebuild for libxml2 - universal-ctags-feedstock#240&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/libxmlsec1-feedstock/pull/41&quot;&gt;Rebuild for libxml2 - libxmlsec-feedstock#40&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7785&quot;&gt;Close out migration for vtk951&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/xgboost-feedstock/pull/256&quot;&gt;Rebuild for r_base 4.5 - xgboost-feedstock#256&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/snowflake-connector-python-feedstock/pull/196&quot;&gt;snowflake-connector-python v3.17.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/miniforge-images/pull/159&quot;&gt;miniforge-images: Bump ubuntu from noble-20250805 to noble-20250910 in /ubuntu&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/aws-sdk-cpp-feedstock/pull/968&quot;&gt;aws-sdk-cpp: Rebuild for aws-c* (Sep ‘25)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7788&quot;&gt;Migration for aws-crt-cpp 0.34.4 (incl. automerge)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/conda-forge-pinning-feedstock/pull/7786&quot;&gt;Migration to s2n 1.5.26 (incl. automerge)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/docker-images/pull/312&quot;&gt;docker-images: Bump actions/checkout from 4.2.2 to 5.0.0 in the github-actions group&lt;/a&gt; (follow-up: &lt;a href=&quot;https://github.com/conda-forge/docker-images/pull/315&quot;&gt;Fix comment on pinned action&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Trigger CI on &lt;a href=&quot;https://github.com/conda-forge/nodejs-feedstock/pull/412&quot;&gt;nodejs v24.8.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Manually issued &lt;a href=&quot;https://github.com/conda-forge/nodejs-feedstock/pull/413&quot;&gt;nodejs v22.19.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Manually issued &lt;a href=&quot;https://github.com/conda-forge/nodejs-feedstock/pull/414&quot;&gt;nodejs v20.19.5&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged &lt;a href=&quot;https://github.com/conda-forge/ibm_db-feedstock/pull/83&quot;&gt;ibm_db-feedstock#83&lt;/a&gt; and issued a bot-rerun on &lt;a href=&quot;https://github.com/conda-forge/ibm_db-feedstock/pull/84&quot;&gt;ibm_db#84&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/symbolic-feedstock/pull/7&quot;&gt;symbolic v12.16.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">To continue to give you a glance into my conda-forge work, we’re continuing with the second week of reporting. This week was a bit leaner on my activities here as I spend my time on preparing my PyData Paris 2025.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" /><media:content medium="image" url="https://avatars2.githubusercontent.com/u/70274?s=460&amp;v=4" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>