Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

Mic92/adios-flake

Composable flake outputs using the adios module system — the ergonomics of flake-parts without the evaluation overhead.

Mic92/adios-flake.json
{
"createdAt": "2026-02-28T10:11:36Z",
"defaultBranch": "main",
"description": "Composable flake outputs using the adios module system — the ergonomics of flake-parts without the evaluation overhead.",
"fullName": "Mic92/adios-flake",
"homepage": "",
"language": "Nix",
"name": "adios-flake",
"pushedAt": "2026-04-03T11:46:50Z",
"stargazersCount": 31,
"topics": [],
"updatedAt": "2026-06-03T21:26:35Z",
"url": "https://github.com/Mic92/adios-flake"
}

⚠️ Alpha — API may change. Not yet recommended for production use.

Composable flake outputs using the adios module system — the ergonomics of flake-parts without the evaluation overhead.

This project was born from a conversation between @adisbladis and @MatthewCroughan. Matthew loved the ergonomics of flake-parts — the composable modules, perSystem, self' — but adisbladis had been digging into the evaluation performance and pointed out how much overhead the NixOS module system adds to every flake evaluation, especially when you multiply it across a graph of flake inputs that all use flake-parts.

The result: adios-flake. It reimplements the flake-parts API on top of adios, a module system designed for memoized evaluation. You get the same mkFlake you know and love, but evaluations run ~30% faster with ~40% fewer attribute lookups and nearly half the primitive operations. See [BENCHMARKS.md]!(BENCHMARKS.md) for the numbers.

  • Familiar API: Drop-in mkFlake with perSystem, self', inputs', and withSystem — if you’ve used flake-parts, you already know how this works
  • Memoized evaluation: System-independent modules are evaluated once regardless of how many systems are configured
  • Three module styles: Ergonomic functions, native adios modules, and static attrsets
  • Extensible output categories: Modules can declare new flake output categories (e.g., containers, templates) with merge semantics (attrset or scalar)
  • Conflict detection: Clear errors when two modules define the same output key, or when a scalar output has multiple providers
  • Cross-module references: self' automatically includes module-declared categories, providing per-system access to other modules’ outputs via the Nix flake fixpoint
  • withSystem helper: Bridge per-system and system-agnostic outputs (e.g., nixosConfigurations)
Terminal window
nix flake init -t github:Mic92/adios-flake
{
inputs = {
adios-flake.url = "github:Mic92/adios-flake";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = inputs@{ adios-flake, self, ... }:
adios-flake.lib.mkFlake {
inherit inputs self;
systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ];
perSystem = { pkgs, ... }: {
packages.default = pkgs.hello;
};
};
}
  • [API Reference]!(docs/api-reference.md)mkFlake parameters, module styles, self', withSystem
  • [Writing Reusable Modules]!(docs/writing-modules.md) — native adios modules, output declarations, custom categories
  • [Benchmarks]!(BENCHMARKS.md) — performance comparison with flake-parts
  • red-tape — Convention-based Nix project builder on top of adios-flake, inspired by blueprint. Drop your Nix files in the right places, and red-tape turns them into a complete flake — packages, devshells, checks, NixOS hosts, modules, templates, and lib — with zero boilerplate.

adios-flake stands on the shoulders of flake-parts by Hercules CI. The mkFlake API, perSystem pattern, self'/inputs' helpers, withSystem bridge, and the overall vision of composable flake modules all originate from flake-parts. The design owes a great deal to the groundwork laid by Robert Hensing and the flake-parts contributors — we just wanted it faster.

Thanks to @adisbladis for creating the adios module system that makes the memoized evaluation possible, and to @MatthewCroughan for insisting that we shouldn’t have to choose between ergonomics and performance.