<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NixOS Stories</title><description>Stories on NixOS, the purely functional Linux distribution.</description><link>https://nixos.org/blog/</link><language>en-us</language><fh:complete xmlns:fh="http://purl.org/syndication/history/1.0"/><image><title>NixOS Stories</title><url>https://nixos.org/logo/nixos-logomark-default-gradient-minimal.svg</url><link>https://nixos.org//blog</link></image><item><title>One Billion Objects and No Database: Inside cache.nixos.org</title><link>https://nixos.org/blog/stories/2026/nix-binary-cache/</link><guid isPermaLink="true">https://nixos.org/blog/stories/2026/nix-binary-cache/</guid><pubDate>Sun, 20 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Amazon Web Services (AWS) has renewed its sponsorship for &lt;code&gt;cache.nixos.org&lt;/code&gt;, the Nix public binary cache, enabling the operation of this foundational piece of infrastructure for another year.&lt;/p&gt;
&lt;p&gt;AWS&apos;s support started in 2023, when its Open Source Strategy and Marketing team, along with its Open Data team, stepped in when a previous sponsorship was discontinued.
At this time, the growth of the Nix ecosystem was reaching an inflection point, outpacing the capacity to sustain it without additional support.
The cache is depended on by Nix users worldwide, and its maintenance is therefore a high priority for the entire community.
At the time, Ron Efroni, then a NixOS Foundation board member and now its president, in concert with &lt;a href=&quot;https://www.linkedin.com/in/davidnalley/&quot;&gt;Dave Nalley&lt;/a&gt;, director of developer experience at AWS, led a conversation that, in the span of around two weeks, &lt;a href=&quot;https://discourse.nixos.org/t/nixos-s3-short-term-resolution/29413&quot;&gt;resolved the concerns about the cache&apos;s sustainability&lt;/a&gt;.
AWS agreed to cover the cache&apos;s hosting costs for 12 months — a substantial contribution which was renewed in &lt;a href=&quot;https://discourse.nixos.org/t/s3-sponsorship-extension-more-resources-to-build-a-more-sustainable-nix/50936&quot;&gt;2024&lt;/a&gt;, &lt;a href=&quot;https://discourse.nixos.org/t/2025-s3-sponsorship-more-resources-for-a-sustainable-nix/67019&quot;&gt;2025&lt;/a&gt;, and again for 2026.&lt;/p&gt;
&lt;h2&gt;Not just any package repository&lt;/h2&gt;
&lt;p&gt;Users most often encounter the cache as the authoritative package repository for both NixOS and the Nix package manager.
Without a cache, every Nix client would have to build every package from source, which can take hours or even days and needs hardware many users do not have.
Most Nix workflows would grind to a halt.&lt;/p&gt;
&lt;p&gt;In serving prebuilt packages, the cache resembles the repositories maintained by Debian, Fedora, and Homebrew.
For downloading and running software, the &lt;a href=&quot;https://nix.dev/manual/nix/stable/protocols/nix-archive&quot;&gt;Nix archive (NAR)&lt;/a&gt; fetched from &lt;code&gt;cache.nixos.org&lt;/code&gt; is similar to a &lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt;, or Homebrew bottle.
But underneath, the Nix cache differs fundamentally in its implementation, reflecting Nix&apos;s radically different approach to software packaging.&lt;/p&gt;
&lt;p&gt;Traditionally, installing software on Linux meant extracting the necessary files from a package archive and distributing them to conventional locations around the filesystem.
While simple, this approach has led to a number of inconveniences.
For example, when packages depend on conflicting versions of the same library, they cannot be installed at the same time, since the two versions&apos; files have to be placed at the same paths.
This is a problem especially for developers, who routinely need to switch between different versions of their toolchains.&lt;/p&gt;
&lt;p&gt;Nix solves this problem by doing away with conventional locations: each package or dependency is placed in its own &lt;a href=&quot;https://nixos.org/guides/nix-pills/18-nix-store-paths.html&quot;&gt;dedicated path&lt;/a&gt; under &lt;code&gt;/nix/store/&lt;/code&gt;.
A NAR fetched from the cache contains the compressed contents of a unique Nix store path: the directories and files that make up a specific package, dependency, or build artifact.
This store path is &lt;em&gt;always&lt;/em&gt; unique, because it includes a &lt;a href=&quot;https://nixos.org/guides/nix-pills/18-nix-store-paths.html?highlight=hash#output-paths&quot;&gt;hash derived from all the inputs&lt;/a&gt; used to build its contents.
Nix prepends this input-addressed hash to the package&apos;s name and version, like so: &lt;code&gt;/nix/store/4lbicqd70qlfdw2l5wbq23c9qj1m5nww-cowsay-3.8.4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By using input-addressed store paths, Nix guarantees a set of properties that are analogous to the atomicity, consistency, isolation, and durability (ACID) guarantees of a relational database.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&quot;/images/blog/stories/nixs-acidic-properties.svg&quot;
alt=&quot;Table of Nix&apos;s ACID-like guarantees: atomicity, consistency, isolation, and durability, each with what Nix provides and its caveats.&quot;
style=&quot;display: block; margin: 1rem auto; float: none; max-width: 100%; height: auto;&quot;
decoding=&quot;async&quot;
loading=&quot;lazy&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;These properties are what give you reproducible build- and run-time behavior, reliable rollbacks, automatic garbage collection, and safe multi-user installations.
This means that users can install, upgrade, or remove packages on the same system at the same time, including packages that pull in conflicting versions of the same dependencies.
For example, if you need to run &lt;code&gt;kubectl&lt;/code&gt; 1.27 (built from an older package set that uses &lt;code&gt;glibc&lt;/code&gt; 2.35) alongside Git 2.51 (built from a newer package set that uses &lt;code&gt;glibc&lt;/code&gt; 2.40), &lt;em&gt;both&lt;/em&gt; programs can coexist on the same machine thanks to Nix&apos;s hashed, input-addressed store paths.
And once store objects (packages, build inputs, etc.) are no longer referenced by the global system or individual users&apos; profiles, Nix can automatically reclaim that disk space.&lt;/p&gt;
&lt;h3&gt;Populating the cache&lt;/h3&gt;
&lt;p&gt;The Nix binary cache is populated by an automated build pipeline centered around Nix&apos;s &lt;a href=&quot;https://github.com/NixOS/hydra&quot;&gt;Hydra CI system&lt;/a&gt;, which directs a pool of geographically distributed builder machines.&lt;/p&gt;
&lt;p&gt;When a maintainer makes a commit that updates a &lt;a href=&quot;https://nix.dev/manual/nix/stable/language/&quot;&gt;Nix expression&lt;/a&gt; in the &lt;a href=&quot;https://github.com/NixOS/nixpkgs&quot;&gt;Nixpkgs GitHub repo&lt;/a&gt;, either by changing its version, dependencies, patches, build instructions, tests, or post-build actions, this triggers Hydra to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;evaluate the commit&apos;s Nix expressions across the whole jobset (more than 211,000 packages);&lt;/li&gt;
&lt;li&gt;generate derivations from those expressions;&lt;/li&gt;
&lt;li&gt;compare them to what&apos;s already been built and cached;&lt;/li&gt;
&lt;li&gt;queue only the new or changed derivations for builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hydra runs many jobsets several times per day as new commits land on active branches, although especially large and expensive jobsets (such as &lt;code&gt;nixos/unstable&lt;/code&gt;) tend to run less frequently.
It signs and uploads successful builds to &lt;code&gt;cache.nixos.org&lt;/code&gt;, where they&apos;re then available as prebuilt binaries.&lt;/p&gt;
&lt;p&gt;Interestingly, since around July of 2026, Hydra runs nearly 40,000 &lt;em&gt;fewer&lt;/em&gt; build jobs than it did just a year ago.
The reason for this is that Nixpkgs recently dropped support for macOS platforms running on &lt;code&gt;x86_64&lt;/code&gt;.
This coincides with Apple&apos;s planned transition away from Intel-based Macs — starting with the upcoming Golden Gate release, new versions of macOS will run only on Apple Silicon.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&quot;/images/blog/stories/nix-binary-cache-ci.svg&quot;
alt=&quot;The binary cache build pipeline: a maintainer commit to Nixpkgs triggers Hydra to evaluate expressions, calculate derivations, queue new builds, and upload signed results to the cache.&quot;
style=&quot;display: block; margin: 1rem auto; float: none; max-width: 100%; height: auto;&quot;
decoding=&quot;async&quot;
loading=&quot;lazy&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;A number of artifacts from this CI pipeline end up in the cache.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://nix.dev/manual/nix/stable/protocols/nix-archive&quot;&gt;Nix Archive (NAR)&lt;/a&gt; files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These &lt;code&gt;nar.xz&lt;/code&gt; or &lt;code&gt;nar.zst&lt;/code&gt; files, stored at &lt;code&gt;nar/&lt;/code&gt;, contain the compressed contents of a single &lt;code&gt;/nix/store/&lt;/code&gt; path.
The NAR format is comparable to &lt;code&gt;tar&lt;/code&gt;, but much simpler: NARs don&apos;t need to support long filenames, POSIX attributes, a wide range of extensions, or rich metadata.
They&apos;re designed to serialize a filesystem object tree, including bare directory structure, file contents, symlinks, and basic metadata.&lt;/p&gt;
&lt;p&gt;The NAR format is an excellent example of simple, stable design: it hasn&apos;t been revised or extended since its introduction — &lt;a href=&quot;https://github.com/NixOS/nix/commit/a09e66da5af348dc25e3b372ec9f518d3532f863&quot;&gt;more than 20 years ago&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Archive information files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These are top-level files named &lt;code&gt;&amp;lt;store-hash&amp;gt;.narinfo&lt;/code&gt;.
Think of them as tiny text records that point to the compressed NAR, record its sizes and hashes, list the store paths it references as runtime dependencies, and carry the Hydra build farm&apos;s signature so clients can verify the artifact.
Despite each individual file&apos;s negligible size, there are more than 90 GB of &lt;code&gt;narinfo&lt;/code&gt; files in the S3 bucket used to host the Nix binary cache.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build logs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;log/&lt;/code&gt; folder stores the output of Nix build jobs for debugging and auditing.
This allows anyone to fetch the build log for a cached store path with &lt;code&gt;nix log /nix/store/&amp;lt;store-hash&amp;gt;-package-name&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Content-addressed mappings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Metadata in the &lt;code&gt;realisations/&lt;/code&gt; folder maps derivations to their content-addressed store paths.
This is relevant for builds using &lt;a href=&quot;https://wiki.nixos.org/wiki/Ca-derivations&quot;&gt;content-addressed derivations (CA-derivations)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Store metadata&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nix-cache-info&lt;/code&gt; is a small metadata file that describes the basic design of the cache as a whole, such as the cache version and its supported features.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;BYOBC&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;official&lt;/em&gt; &lt;code&gt;cache.nixos.org&lt;/code&gt; lives in S3, but if you happen to have half a petabyte of available storage, you could definitely roll your own.
As we explained previously, each package in &lt;code&gt;cache.nixos.org&lt;/code&gt; has been built from source by a pool of geographically distributed builders — bare-metal and cloud alike, spanning most of Europe — using Nix&apos;s own CI.&lt;/p&gt;
&lt;p&gt;This build-time reproducibility is possible because the recipes Nix uses to build software, &lt;a href=&quot;https://nix.dev/manual/nix/stable/language/derivations.html&quot;&gt;derivations&lt;/a&gt; and &lt;a href=&quot;https://nix.dev/manual/nix/stable/language/&quot;&gt;the Nix language&lt;/a&gt;, don&apos;t imperatively &lt;em&gt;prescribe&lt;/em&gt; anything.
Build recipes are expressed in the Nix language; Nix evaluates these to produce a derivation, or a low-level build specification.
The derivation records every declared input; so as long as inputs remain available (via &lt;code&gt;cache.nixos.org&lt;/code&gt;, in Nixpkgs, or locally) Nix can reproduce any build, anywhere, at any time.&lt;/p&gt;
&lt;p&gt;This makes it so &lt;em&gt;anyone&lt;/em&gt; can host their own Nix binary cache if they wanted, just by cloning the &lt;a href=&quot;https://github.com/NixOS/nixpkgs&quot;&gt;Nixpkgs GitHub repo&lt;/a&gt; and building every package from source.
They would need at least a terabyte of space just for the build step, and they will probably want to provision a pool of concurrent builders.
And they would need to foot the bill for the data egress charges associated with serving millions of users.
But this isn&apos;t just technically possible, it&apos;s &lt;em&gt;doable&lt;/em&gt;.
The Flox Binary Cache is one such example: it applies the same principle of reproducible Nix builds to provide prebuilt packages (including &lt;a href=&quot;https://flox.dev/blog/the-flox-catalog-now-contains-nvidia-cuda/&quot;&gt;CUDA-accelerated packages&lt;/a&gt; like PyTorch and TensorFlow) directly from canonical Nixpkgs definitions.&lt;/p&gt;
&lt;p&gt;And the best part is that, when built against the same Nixpkgs commits, packages in Flox&apos;s or anyone/anywhere&apos;s binary cache &lt;a href=&quot;https://luj.fr/blog/is-nixos-truly-reproducible.html&quot;&gt;are almost always &lt;em&gt;bit-for-bit identical&lt;/em&gt;&lt;/a&gt; to those in &lt;code&gt;cache.nixos.org&lt;/code&gt;. That&apos;s because Nix builds run inside an isolated sandbox.
This means that only explicitly declared inputs are available, so your toolchain can&apos;t silently pull in host libraries, environment variables, arbitrary metadata, or other kinds of state.
If the inputs match, the outputs match too.&lt;/p&gt;
&lt;p&gt;Building deterministically at this scale is surprisingly difficult to achieve.
In practice, Nix&apos;s functional build pattern nails it for the overwhelming majority of packages (&lt;a href=&quot;https://hal.science/hal-05630285v1&quot;&gt;about 99.9%&lt;/a&gt;), with the remaining sliver being tracked (and continuously chipped away at) as non-deterministic outliers.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&quot;/images/blog/stories/byobc.svg&quot;
alt=&quot;Comparison of the official cache.nixos.org with a self-hosted binary cache, covering storage requirements, builder pool, and monthly costs.&quot;
style=&quot;display: block; margin: 1rem auto; float: none; max-width: 100%; height: auto;&quot;
decoding=&quot;async&quot;
loading=&quot;lazy&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Operating on an enormous scale&lt;/h2&gt;
&lt;p&gt;The overwhelming majority of Nix clients fetch and use software packages from the Nix binary cache.
It fields approximately 5,700 requests per second — almost &lt;em&gt;15 billion&lt;/em&gt; requests per month — and accounts for the vast majority of traffic handled by the public Nix ecosystem&apos;s CDN endpoints.
It stores 636 TB of data, with around 545 TB in AWS&apos;s infrequent-access storage tier and 91 TB in standard storage.
Just as impressive, &lt;code&gt;cache.nixos.org&lt;/code&gt;, contains more than 1 billion objects, making it one of the largest public software caches on the Internet.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&quot;/images/blog/stories/binary-cache-at-a-glance.svg&quot;
alt=&quot;cache.nixos.org by the numbers as of July 2026: 636 TB stored, ~15 billion requests per month, over 1 billion objects, 94.29% cache hit ratio, 892 TB of bandwidth per week.&quot;
style=&quot;display: block; margin: 1rem auto; float: none; max-width: 100%; height: auto;&quot;
decoding=&quot;async&quot;
loading=&quot;lazy&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;Such a feat requires careful design.
Faced with this challenge, one may be tempted to start diagramming complex architectures with eventually-consistent distributed databases and the like.&lt;/p&gt;
&lt;p&gt;In a scene from American novelist Cormac McCarthy&apos;s &lt;em&gt;Blood Meridian&lt;/em&gt;, a character exhibits a giant petrified dinosaur bone before a group of mystified, stupefied cowboys.
&quot;Your heart&apos;s desire is to be told some mystery. The mystery is that there is no mystery&quot;, he tells them.&lt;/p&gt;
&lt;p&gt;There is no mystery to the Nix binary cache: it is just a huge, signed key–value store hosted in an Amazon S3 bucket.
Every key is derived from a unique hash, and because there&apos;s no database lookup required, &lt;em&gt;there is no backing database&lt;/em&gt;.
This avoids a slew of wicked problems that tend to arise when you&apos;re attempting to scale a massive project backed by a database.&lt;/p&gt;
&lt;p&gt;The &quot;fresh&quot; contents of &lt;code&gt;cache.nixos.org&lt;/code&gt; live in a single S3 bucket in the AWS &lt;code&gt;us-east-1&lt;/code&gt; region.
The Nix binary cache also contains packages that are at more than a decade old, software that in some cases has disappeared from the Internet.
Because the Nix community has preserved its source code and build definitions, it&apos;s possible to rebuild it today, on modern systems, using its required dependencies.
As a cost optimization, these older, historical packages typically live in cheaper AWS storage tiers.
The bucket for less-frequently used packages recently moved to &lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html&quot;&gt;S3 Intelligent-Tiering&lt;/a&gt;, which automatically shifts objects among &quot;Frequent&quot;, &quot;Infrequent&quot;, &quot;Archive Instant&quot;, and &quot;Archive&quot; tiers, based on how often they&apos;re accessed.
This is expected to reduce storage costs, as well as the effort required of the &lt;a href=&quot;https://nixos.org/community/teams/infrastructure/&quot;&gt;Nix Infrastructure team&lt;/a&gt; to manage archived packages.&lt;/p&gt;
&lt;p&gt;If the design of the Nix binary cache is conceptually simple, &lt;em&gt;distributing&lt;/em&gt; cached artifacts efficiently and reliably to consumers spread out across the world is a much more difficult problem.
To this end, a content distribution network, &lt;a href=&quot;https://en.wikipedia.org/wiki/Fastly&quot;&gt;Fastly&lt;/a&gt;, sits in front of &lt;code&gt;cache.nixos.org&lt;/code&gt; as its global caching layer.
If a Nix package isn&apos;t already cached, Fastly streams it from S3 as it arrives, so users don&apos;t have to wait for it to download before starting.
For very large files, Fastly splits them up — ironically, to get around its own size limitations.
It also transparently rewrites certain kinds of S3 permission errors, so users see &lt;code&gt;404: Not Found&lt;/code&gt; errors, rather than foreboding &lt;code&gt;403: Forbidden&lt;/code&gt; messages.
Finally, Fastly handles TLS for the &lt;code&gt;cache.nixos.org&lt;/code&gt; domain at the edge, providing secure HTTPS connections to clients while communicating with S3 over TLS.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&quot;/images/blog/stories/cdn.svg&quot;
alt=&quot;Architecture of cache.nixos.org: an S3 bucket in us-east-1 using Intelligent-Tiering, fronted by the Fastly CDN as a global caching layer.&quot;
style=&quot;display: block; margin: 1rem auto; float: none; max-width: 100%; height: auto;&quot;
decoding=&quot;async&quot;
loading=&quot;lazy&quot;
/&amp;gt;&lt;/p&gt;
&lt;h3&gt;Amazon S3 just works&lt;/h3&gt;
&lt;p&gt;Even though the binary cache is simple enough to be host on many different architectures, S3 is particularly suited to the task for a few specific reasons.
At the time &lt;code&gt;cache.nixos.org&lt;/code&gt; was created, &lt;em&gt;there was basically no other option&lt;/em&gt;.
In 2007, if you wanted access to distributed, highly available, pay-as-you-go object storage, your choices were Amazon S3 or … running Hadoop and HDFS yourself.
But unlike S3, HDFS isn&apos;t a key–value store — it isn&apos;t even an object store!
It&apos;s a hierarchical, POSIX-like filesystem, not a global bucket that anyone can fetch from over HTTP.&lt;/p&gt;
&lt;p&gt;For the Nix community&apos;s requirements, S3&apos;s key-addressed object storage was the perfect substrate for &lt;code&gt;cache.nixos.org&lt;/code&gt;: &lt;code&gt;.nar&lt;/code&gt; and &lt;code&gt;.narinfo&lt;/code&gt; files could be persisted as object keys and exposed via S3&apos;s internet-facing REST APIs.
S3 could store a virtually unlimited number of blobs, serve them up directly over HTTP, replicate them for durability, and scale to meet growing demand.
This was revolutionary at the time, and perfect for the &quot;not trying to do too much&quot; design ethos of &lt;code&gt;cache.nixos.org&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Today, the Nix binary cache could live in virtually any other hyperscale cloud.
Its design ethos focused on simplicity means that it is not locked into a specific platform.
The cache is in S3 because S3 works, and the rational choice is to keep it where it works — this is how &lt;code&gt;cache.nixos.org&lt;/code&gt; has been hosted for almost two decades, after all.&lt;/p&gt;
&lt;p&gt;This status quo was challenged in 2023, when one of the NixOS Foundation&apos;s principal financial sponsors discontinued its support.
During this time, Nix saw enormous growth, meaning that stable infrastructure was a priority concern.
The NixOS Foundation responded to this challenge with radical transparency, and issued a call for assistance from the Nix community and commercial vendors.
Our employer, Flox, was one of the vendors that responded to this call, along with others in the Nix-adjacent space.
AWS Open Source also responded to this call, pledging credits to help fund &lt;code&gt;cache.nixos.org&lt;/code&gt; for the fiscal year — a contribution which proved central to the sustainability of the Nix ecosystem and which started what has become a proven track record of support for the binary cache.&lt;/p&gt;
&lt;h3&gt;Maintaining the cache&lt;/h3&gt;
&lt;p&gt;At its core, the binary cache is just a signed collection of blobs in S3, which is itself a basic key–value store, with no backing database and almost no service-dependent logic.
This primitivity has the advantage of making the cache comparatively simple to &lt;em&gt;maintain&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But there&apos;s an absolute difference between theory and practice.
&lt;em&gt;In theory&lt;/em&gt; &lt;code&gt;cache.nixos.org&lt;/code&gt; is an ideal design, implemented in an ideal cloud service with ideal users and ideal usage characteristics.
&lt;em&gt;In practice&lt;/em&gt;, and at scale, the binary cache is &lt;em&gt;low-&lt;/em&gt; but by no means &lt;em&gt;no&lt;/em&gt;-maintenance.&lt;/p&gt;
&lt;p&gt;Even the best, most thoughtful designs need upkeep, after all.
For the most part, the Infrastructure team supporting the binary cache does its work behind the scenes, to the point that the cache itself seems to &quot;just work&quot;.
Nevertheless, this team has had to put out its share of fires, as well as deal with occasional crises.
The fact that it manages to keep a low profile is a testament to the efforts of its members, present and past.
While Amazon and the folks at AWS kindly help offset the fiscal (and, to some extent, technological) burden of hosting the Nix binary cache; the infra team shoulders the operational burden of keeping it available, responsive, and up-to-date.&lt;/p&gt;
&lt;h2&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;On behalf of the NixOS Foundation, we want to express our gratitude to AWS for its ongoing support.
Their help frees the Infra team to focus on durable fixes rather than day-to-day firefighting.
It also gives the team headroom for much more ambitious work, like better garbage collection, new mirroring options, and partnering opportunities.&lt;/p&gt;
&lt;p&gt;If you&apos;d like to learn more about Nix infrastructure (along with the people who support and maintain it), &lt;a href=&quot;https://nixos.org/community/teams/infrastructure/&quot;&gt;check out their team page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Special thanks to Nix-whisperer &lt;a href=&quot;https://discourse.nixos.org/u/tomberek&quot;&gt;Tom Bereknyei&lt;/a&gt; for consultation, feedback, and hugely constructive criticism during the drafting of this article.&lt;/em&gt;&lt;/p&gt;
</content:encoded><author>Rok Garbas (garbas), Steve Swoyer (reyows.evets)</author></item><item><title>Tales from Nixpkgs - PR</title><link>https://nixos.org/blog/stories/2023/tales-001/</link><guid isPermaLink="true">https://nixos.org/blog/stories/2023/tales-001/</guid><pubDate>Sat, 04 Mar 2023 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is the first in a new series of posts called &quot;Tales from Nixpkgs&quot; where we examine Nixpkgs commits to understand how this ecosystem works and provide a bit of visibility into the process. This also gives us a chance to show appreciation for the maintainers and perhaps also uncover interesting stories along the way.&lt;/p&gt;
&lt;p&gt;Let&apos;s take a look at a randomly picked commit from the last year of Nixpkgs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log --pretty=oneline --since 1y | shuf | head -n1 | cut -f1 -d&apos; &apos; | xargs git show
commit 785bafc33818503172c7eecb60af711d794195b3
Merge: e7d00dfbd39 1e69e5c4280
Author: Fabian Affolter &amp;lt;mail@fabian-affolter.ch&amp;gt;
Date:   Fri Mar 3 15:05:51 2023 +0100

    Merge pull request #219037 from fabaff/openai-bump

    python310Packages.openai: 0.26.5 -&amp;gt; 0.27.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The original PR for this is &lt;a href=&quot;https://github.com/NixOS/nixpkgs/pull/219037&quot;&gt;#219037&lt;/a&gt;. The motivation is to update the version of the &lt;code&gt;openai&lt;/code&gt; Python package. It looks like along the way there is also a related update to &lt;code&gt;shell-genie&lt;/code&gt; and some improvements to the metadata in Nixpkgs. A simple version bump is usually simpler, but this example is good because it will help us explain a few things along the way.&lt;/p&gt;
&lt;p&gt;The entails taking a look at the build recipe and updating a few things:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git diff 785bafc33818503172c7eecb60af711d794195b3~1 785bafc33818503172c7eecb60af711d794195b3
pkgs/development/python-modules/openai/default.nix
diff --git a/pkgs/development/python-modules/openai/default.nix b/pkgs/development/python-modules/openai/default.nix
index ede1a7a3d84..92f2e327eb3 100644
--- a/pkgs/development/python-modules/openai/default.nix
+++ b/pkgs/development/python-modules/openai/default.nix
@@ -23,7 +23,7 @@

 buildPythonPackage rec {
   pname = &quot;openai&quot;;
-  version = &quot;0.26.5&quot;;
+  version = &quot;0.27.0&quot;;
   format = &quot;setuptools&quot;;

   disabled = pythonOlder &quot;3.7.1&quot;;
@@ -31,8 +31,8 @@ buildPythonPackage rec {
   src = fetchFromGitHub {
     owner = &quot;openai&quot;;
     repo = &quot;openai-python&quot;;
-    rev = &quot;v${version}&quot;;
-    hash = &quot;sha256-eKU+WRFf7f1yH63vcoQ9dVeqhJXBqMJGpk/9AoEgR0M=&quot;;
+    rev = &quot;refs/tags/v${version}&quot;;
+    hash = &quot;sha256-pXttGvnApYuwkWU7kCDNjw0rjHD5AyUvujfvpDVjgxM=&quot;;
   };

   propagatedBuildInputs = \[
@@ -91,6 +91,7 @@ buildPythonPackage rec {
   meta = with lib; {
     description = &quot;Python client library for the OpenAI API&quot;;
     homepage = &quot;https://github.com/openai/openai-python&quot;;
+    changelog = &quot;https://github.com/openai/openai-python/releases/tag/v${version}&quot;;
     license = licenses.mit;
     maintainers = with maintainers; \[ malo \];
   };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First off, we see a bump in version from 0.26.5 to 0.27.0. Next we see the source is also updated with its hash providing an integrity check. (Note: these two steps are often performed by automation, stay tuned for future episodes). Lastly we see an improvement to the metadata pointing at a consistent location for the changelog of the OpenAI project.&lt;/p&gt;
&lt;p&gt;Next we see changes to &lt;code&gt;shell-genie&lt;/code&gt;. This is an application that uses &lt;code&gt;openai&lt;/code&gt; to provide helpful command-line suggestions and it uses openai as a dependency.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git diff 785bafc33818503172c7eecb60af711d794195b3~1 785bafc33818503172c7eecb60af711d794195b3
pkgs/applications/misc/shell-genie/default.nix
diff --git a/pkgs/applications/misc/shell-genie/default.nix b/pkgs/applications/misc/shell-genie/default.nix
index 1429aabcd80..7225eb4c3fc 100644
--- a/pkgs/applications/misc/shell-genie/default.nix
+++ b/pkgs/applications/misc/shell-genie/default.nix
@@ -8,18 +8,16 @@ with python3.pkgs;

 buildPythonPackage rec {
   pname = &quot;shell-genie&quot;;
-  version = &quot;unstable-2023-01-27&quot;;
+  version = &quot;0.2.6&quot;;
   format = &quot;pyproject&quot;;

-  src = fetchFromGitHub {
-    owner = &quot;dylanjcastillo&quot;;
-    repo = pname;
-    rev = &quot;d6da42a4426e6058a0b5ae07837d8c003cd1239e&quot;;
-    hash = &quot;sha256-MGhQaTcl3KjAJXorOmMRec07LxH02T81rNbV2mYEpRA=&quot;;
+  src = fetchPypi {
+    pname = &quot;shell\_genie&quot;;
+    inherit version;
+    hash = &quot;sha256-MgQFHsBXrihfWBB/cz45ITf8oJG2gSenf1wzdbrAbjw=&quot;;
   };

   nativeBuildInputs = \[
-    poetry
     poetry-core
   \];

@@ -35,9 +33,14 @@ buildPythonPackage rec {
   # No tests available
   doCheck = false;

+  pythonImportsCheck = \[
+    &quot;shell\_genie&quot;
+  \];
+
   meta = with lib; {
     description = &quot;Describe your shell commands in natural language&quot;;
     homepage = &quot;https://github.com/dylanjcastillo/shell-genie&quot;;
+    # https://github.com/dylanjcastillo/shell-genie/issues/3
     license = licenses.unfree;
     maintainers = with maintainers; \[ onny \];
   };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We see a set of very similar changes, a version bump, update and improvement to how we fetch the sources, additional checks performed, as well as an identification of an issue - there is no declared license for the &lt;a href=&quot;https://github.com/dylanjcastillo/shell-genie&quot;&gt;shell-genie&lt;/a&gt; project. This brings us to an important part of the work of packaging. It is not only the technical work to shepherd updates along and fix bugs, but to communicate and coordinate across the open source world. &lt;a href=&quot;https://github.com/fabaff&quot;&gt;@fabaff&lt;/a&gt; submitted an &lt;a href=&quot;https://github.com/dylanjcastillo/shell-genie/issues/3&quot;&gt;issue&lt;/a&gt; to the upstream project which resulted in &lt;a href=&quot;https://github.com/dylanjcastillo/shell-genie/commit/9421a56fe353ee0066244a5cb286270a6b12cb16&quot;&gt;this addition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is through many small changes and fixes like this that the overall ecosystem improves and these improvements have benefits not just for the Nix ecosystem, but outside of it as well. A common theme we will see in these tales is that our very strict approach to packaging has trickle-down benefits for upstream projects and other package managers.&lt;/p&gt;
&lt;p&gt;So we have a fairly simple update, but also improvements to metadata and collaboration with other communities. Next in the PR we see some testing of the new recipe across various architectures and an approval from &lt;a href=&quot;https://github.com/malob&quot;&gt;@malob&lt;/a&gt;. With the approval and all checks and tests in the green, the PR was merged. Sounds like success!&lt;/p&gt;
&lt;p&gt;Thank you &lt;a href=&quot;https://github.com/fabaff&quot;&gt;@fabaff&lt;/a&gt; for your contribution!&lt;/p&gt;
</content:encoded><author>NixOS</author></item></channel></rss>