Finix - a daily-drivable experimental os, featuring finit as pid 1, to explore the NixOS design space

For the past year I’ve been working on finix, a NixOS spin that among other things replaces systemd with finit as pid 1. It started as a way to explore the NixOS design space - things like evaluation speed, module loading, and service decoupling - but has since evolved into a fully usable system. I daily-drive it on my laptop, home server, and Steam Deck. If you’re feeling bold, consider this an invitation to try it out.

If you’re already on NixOS, finix should feel familiar:

  • uses the same testing framework
  • works with nixos-rebuild, nixos-enter, and nixos-install
  • if you use flakes, you define your configuration via nixosConfigurations

While I’m a fan of systemd, I’ve been surprised at how much I enjoy using finit. It’s simple yet surprisingly capable:

  • service management with conditions, dependencies, and readiness notification
  • runlevels, cgroups, and watchdog support
  • plugin system for extensibility
  • writing a finit service in nix is very familiar to writing one for systemd

Example service definition:

{ config, pkgs, lib, ... }:
{
  finit.services.php-fpm = {
    conditions = [ "service/syslogd/ready" ];
    command = "${cfg.package}/bin/php-fpm -y ${configFile}";
    reload = "${pkgs.coreutils}/bin/kill -USR2 $MAINPID";
    notify = "systemd";
  };
}

finix has been running on my laptop for a while now with the following stack:

  • finit instead of systemd as init system/service manager
  • seatd instead of (e)logind as the seat manager
  • mdevd instead of (e)udev as the device manager
  • niri as the wayland compositor

GitHub: GitHub - finix-community/finix: A daily-drivable experimental os, featuring finit as pid 1, to explore the NixOS design space · GitHub
Discord: finix

Happy April 1st everyone!

43 Likes

(sorry this is off-topic)

@aanderse I can’t help noticing you have a i7-1370P :o

I’ve been running with this cpu for a while now, and I’ve never been able to squeeze out the performance from it. Does this ring a bell to you?

Happy April 1st everyone!

Wait a minute, is this a joke or not? :sweat_smile:

2 Likes

Not


Text for twenty characters

“NixOS is tied to systemd” → NO MORE!

I’ve been happy to follow your progress updates in private, it’s a very ambitious and outstanding project. I’m still waiting for the demo container config so I can test it in my own projects :wink:

Big congratulations on reaching the feeling of “this is worthy of an announcement”(let’s call it 0.01?:slight_smile:) and nice choice of day :rofl:

3 Likes

This is very cool, thank you for sharing! Just for my understanding; is there any compatibility between finix and nixos modules? What criteria make modules from NixOS compatible or incompatible with finix?

1 Like
  • some programs.* modules run completely fine with no adjustments, simply import from nixpkgs, because they don’t define systemd services - i run some of those on my system
  • finix has support for modular services… in fact one modular service even has explicit finit support
  • finix does not implement any systemd.* options, so any module using those options would not evaluate on finix
  • many nixos modules assume every other module is available and imported so using any module which assumes another would need to be handled carefully, if those modules could run with finix

i want a good solution to modules which work across both nixos and finix. i am supporting modular services as much as i can, but i am still not convinced it is the best solution - this is why i really want to support pushing modular services work as far as we can so i can see if it’s viable or not. i think there are serious incompatibilities between service managers that can pop up and be problematic though. finit is not widespread so i don’t think obstacles from a finix perspective hold much weight on the development of modular services unfortunately… :sweat_smile:

if you want me to go into more technical details i would be happy to share.

4 Likes

The joke is so well planned that he also did a talk at [NixCon 2025](https://www.youtube.com/live/YQU6oxxat6I?t=17208s

4 Likes

Thank you, that helps a lot. I generally share your opinion that service managers are quite different so a general interface might be tricky, but it would be awesome if it was possible. See also Restructuring NixOS to work without systemd? e.g., with SysVinit - #84 by NotAShelf , though you’re probably aware of that discussion already.

2 Likes

(I need to do some reading on modular services, so this is coming from a place of ignorance.)

I thought modular services were about addressing the fact that most nixos modules only let you define a single “instance” of that service, and modular services give is a standardized way to author/use modules that can define N instances instead. I don’t see how finit’s feature set would affect the design here (I know finit allows you to define more than one service, else you wouldn’t be able to build a particularly useful Linux box).

1 Like

It explicitly also covers creating a minimal API that can be implemented by a non-systemd init system, or systemd with reduced feature sets (e.g. for user units).

AIUI the original intent was reuse in non-NixOS use cases (e.g. home-manager), but it has this as a side benefit.

5 Likes

Kudos for the effort! Never heard of finit before.

I wonder why you chose it over, say dinit which I think plays in the same park. Just out of curiosity :slight_smile:

I have been looking for something like this after the recent controversy with systemd and the age verification stuff, thanks!

3 Likes

i used dinit in an early prototype of finix and thought it was great! a few reasons i switched, though:

  • dinit is a service manager which you can use as and init system, though more work is required - finit is a full init system so includes a fair bit more out of the box
  • finit has an incredibly simple conditions system which covered all my needs, compared to the more powerful yet complex systems dinit/systemd have
  • finit handles all service management when switching from one generation to another - i didn’t have to write any code to handle this! this is the biggest reason! i can’t stress enough how amazing this is!
6 Likes

Thanks, that’s great insight!