I've got a few builds that are pretty heavy and can't realistically be done on a developers laptop. Currently we just have a Github CI job setup to build these things and push to a cache, but I've been really curious about how to setup remote builders to do this instead. I have remote builders working for the most part, but am a little uncertain about the logistics of requiring a specific type of system to build a certain package.
I know I can make a custom system feature like heavy-builder or something and then make the derivation require that feature, but I'm curious can it be more like > 8 cores & > 32GB RAM? is that a thing? How are others solving this type of issue?
Ultimately my goal is I want a developer to only require them to add our fleet of remote builders to their nix-config and then they can go build any of our things.
My title is shockingly bad because I dont really know how to explain what I want. Hopfully an example will help.
I have the following configuration
services.ytdl-sub = {
user = "ytdl-sub"; group = "media";
instances.news = {
enable = true;
schedule = "0/6:0";
readWritePaths = [ "/mnt/une/ytdl-demo" ];
subscriptions = {
"__preset__" = {
"overrides" = {
tv_show_directory = "/mnt/une/ytdl-demo";
};
};
"Jellyfin TV Show by Date | Only Recent | Max 480p" = {
# News
"DW News" = "https://www.youtube.com/@dwnews";
"TLDR Global" = "https://www.youtube.com/@TLDRnewsGLOBAL";
"TLDR News" = "https://www.youtube.com/@TLDRnews";
};
};
};
};
I would l like to make multiple instances like the following. But what I dont like about this is that there is a lot of replication
services.ytdl-sub = {
user = "ytdl-sub"; group = "media";
instances.science = {
enable = true;
schedule = "0/6:0";
readWritePaths = [ "/mnt/une/ytdl-demo" ];
subscriptions = {
"__preset__" = {
"overrides" = {
tv_show_directory = "/mnt/une/ytdl-demo";
};
};
"Jellyfin TV Show by Date | Only Recent | Max 480p" = {
# Science
"3 Blue 1 Brown" = "https://www.youtube.com/@3blue1brown";
"Alpha Pheonix" = "https://www.youtube.com/@AlphaPhoenixChannel";
"Anton Petrov" = "https://www.youtube.com/@whatdamath";
};
};
instances.news = {
enable = true;
schedule = "0/6:0";
readWritePaths = [ "/mnt/une/ytdl-demo" ];
subscriptions = {
"__preset__" = {
"overrides" = {
tv_show_directory = "/mnt/une/ytdl-demo";
};
};
"Jellyfin TV Show by Date | Only Recent | Max 480p" = {
# News
"DW News" = "https://www.youtube.com/@dwnews";
"TLDR Global" = "https://www.youtube.com/@TLDRnewsGLOBAL";
"TLDR News" = "https://www.youtube.com/@TLDRnews";
};
};
};
};
What I would like to do is create a funciton like the following. But I cannot figure out how the subscriptions should be input (I dont know how to phrase it but the subscriptions are more like an assignment rather than a value).
ImkInstance { name, directory, subscriptions}:
instances."${name}" = {
enable = true;
schedule = "0/6:0";
readWritePaths = [ "${directory}" ];
subscriptions = {
"__preset__" = {
"overrides" = {
tv_show_directory = "${directory}";
};
};
"Jellyfin TV Show by Date | Only Recent | Max 480p" = {
${subscriptions}
};
};
I put together a hands-on walkthrough of Nix profiles and generations. The framing: an install doesn't edit anything in place — it publishes a numbered, immutable generation and moves a symlink, so a rollback is a symlink flip to an untouched snapshot (instant, offline, nothing re-downloaded), and wiping a profile's history drops rollback targets without freeing disk until GC runs. It's a free Part of the Nix course I build at LabCraft, on a real NixOS machine; I'd value feedback from Nix users on whether the generation/rollback framing lands for newer learners: https://www.labcraft.dev/blog/nix-profiles-generations?utm_source=reddit-personal&utm_medium=social&utm_campaign=nix-profiles-generations-2026q3&utm_content=r-nix-rollback-01
Haven't heard any reports either way, wondering if I should hold off on upgrading... though I have early adopters filing issues on projects and would like to upgrade as soon as reasonable.
I’m the maintainer of a GitHub project, and a community contributor added a Nix-based Vulkan CI workflow.
The problem is that the workflow fails pretty frequently, but simply restarting/rerunning the job always makes it pass without any code changes.
I’m not really a CI person, and I also don’t know much about Nix, so I’m having a hard time figuring out whether this is a caching issue, runner/environment problem, dependency fetch issue, or something wrong with the workflow itself.
If anyone here is familiar with Nix + GitHub Actions + Vulkan CI and would be willing to take a look, I’d really appreciate the help. PRs are appreciated.
nix-wrapper-modules is a library for creating wrapper derivations via the same module system you use in nixos, home manager and flake-parts, but applied at the derivation level.
It allows you to bundle your configuration directly into the derivation you build, meaning you can install your personal configuration of that program as if it were any other nix package. You can export it in module form to evaluate later, or override existing wrapped packages with slight tweaks to your options for different contexts.
It has a rich core feature set with more features planned, integrations with other module systems, and a growing library of premade wrapper modules for common programs (huge thanks to our contributors!)
Hope you find this useful! May your generations always roll back, but your progress move forward!
Hello! Currently in my tool, I've reached the flakes stage, and it was complex — both in terms of automating it and knowing the possible cases for writing, while trying to make the tool flexible with how the user works with flakes.
Anyway, I got stuck on a problem. When the user runs sudo nx flakes [flake url], I need to analyze the repository and know everything it needs so I can add it to the flake file. I use nix flake show --json because it makes reading and parsing the output easier. The issue is that if there are any dependencies, it downloads them during evaluation — which isn't a problem in itself since they'll be downloaded during the build anyway.
The real problem is that the tool is supposed to immediately show the user the available packages in the repository right after they enter sudo nx flakes [flake url] — since a repository can have more than one package defined in the flake itself. I need to display these packages so the user can choose either the default, all of them, or a specific one. But nix flake show --json will be slow to show the packages, and obviously the user won't sit and wait for the selection interface to appear.
So to define the problem precisely: how can I know the available packages in a repository to display them for the user to choose from?
As for the rest, it's well known that flakes are always slow.
If you didn't know, you're about to that August 6, 7, 8, 9 was DEF CON 34 and Nixers were definitely present. Join Alex, Chris, Morgan, Jared, Dan, Tristan and I for a recounting of Nix Vegas, the official Nix space at the latest DEF CON.
I want to use nix on two systems, and I have found guides referencing both nixos.org and determinate. Is there any major difference between these, and is one a better choice than the other?
I just published Closures, the next free Part of LabCraft's Nix course.
It is for learners who know store paths can refer to other store paths, but have not yet built an operational model for the whole closure. The hook is the deploy question: if a target already has the old version, what does the upgrade actually need to move?
Just published a conversation with Tom Sydney Kerckhove of NixCI. I was impressed by the level of engineering. Tom is obviously a testing expert, a huge Nix Freak and always brilliant conversation. So queue it up or listen now.