I have a little proof-of-concept prototype CLI tool for "a friendly generic frontend for determinate computing", after the braindump here. Disclaimer, I used an LLM for this prototype and plan on going back with finer combs later.
Github: https://github.com/thebrandonlucas/kai
Here's a quick article on the why and basic overview: https://blu.cx/posts/articles/2026-07-13-kai-friendly-frontend/.
I attached a little demo video too.
In a nutshell, it's meant to allow a generic set of actions common to any determinate system (i.e. nix or guix) to be performed while being able to swap the backend "blueprint". Another primary goal is to make the main things people like to do with determinate systems super easy, which in my opinion is a primary reason people don't use them.
There's only two commands, shell for dev shells and build for building a simple machine image with a preset of packages on it.
Also, thanks @Luke Boswell for the roc-platform packages which I'm currently experimenting with porting over (I got the shell command working in this branch. My initial design was more focused on getting the CLI integrated and working but it's effectful and I love the pure, portable generic EDSL you built. More on that soon!
kai.mp4
Made some fun updates on this and learned a lot of Roc, built my first little platform, and did my first (prototype) release :D
devlog writeup for the curious.
I incorporated @Luke Boswell 's roc-blueprint (I preserved your roc-blueprint LICENSE in the blueprint/ dir, lmk if that's the appropriate etiquette) and adapted it into a little CLI tool called kai, making a higher level abstraction DSL (hence the platform) on top of it. There's only one command for now, shell, much more to come soon.
But just look how simple this is!
app [config] {
kai: platform "../../platform/main.roc",
}
import kai.Kai
config : Kai.Config
config = {
name: "cowsay shell",
shell: {
pkgs: ["cowsay"],
},
}
vs. the equivalent flake.nix
{
"description" = "Development environments for cowsay shell";
"inputs" = {
"nixpkgs" = {
"url" = "github:NixOS/nixpkgs/nixos-unstable";
};
};
"outputs" =
{ nixpkgs, ... }:
{
"devShells" = {
"x86_64-linux" = {
"default" = nixpkgs."legacyPackages"."x86_64-linux"."mkShell" {
"packages" = [
nixpkgs."legacyPackages"."x86_64-linux"."cowsay"
];
};
};
};
};
}
Next up I plan to make it super modular in the style of caddy, such that different determinate backends could be used interchangeably (nix/guix/custom), and so that users can add their own modules or modify the default implementations.
Then I'll begin working further on defining the generic determinate protocol interface further and begin integrating some more commands.
Love it. I shared your article too https://www.reddit.com/r/roc_lang/s/4S2PN4gkcZ
One other thing I failed to note: one of the really cool things about developing with nix is that you can easily have people run code without manually downloading a binary. If you set it up properly, anybody on any machine can just do like this:
nix run github:thebrandonlucas/kai -- version
Which I find super cool. Instead of telling people to update they can just test the latest code with one command every time.
Dev update on Kai. Was able to lay a modular foundation for writing plugins. Should hopefully be able to move much quicker now on features: https://blu.cx/posts/blog/2026-08-04-kai-devlog-2-modularity/
blu said:
Dev update on Kai. Was able to lay a modular foundation for writing plugins. Should hopefully be able to move much quicker now on features: https://blu.cx/posts/blog/2026-08-04-kai-devlog-2-modularity/
The write-up is a great read, thanks!
The write-up is a great read, thanks!
Thanks a ton!
Update on kai: custom DSL and plugins themselves are modular. 3 lines gets you a devshell:
shell {
pkgs: ["cowsay", "fortune"]
}
https://blu.cx/posts/blog/2026-08-11-kai-devlog-3-custom-dsl-plugin-modules/
Last updated: Aug 12 2026 at 12:35 UTC