Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

devix

Stylix, but for development environments.

Stylix lets you declare a colour scheme once and have every program that understands theming configure itself from it. devix does the same thing for development tooling: you describe a language once — its language servers, its formatters, how it should be indented — and every editor that understands the description configures itself from it.

The problem it solves is duplication. Setting up Rust in Helix means writing a languages.toml stanza. Setting up the same Rust in Zed means writing a different stanza in settings.json. Doing it for an AI harness like OpenCode means a third format. Three files, three syntaxes, one fact — which is exactly the kind of thing Nix is supposed to abolish.

devix = {
  enable = true;
  languages.rust.enable = true;
};

programs.helix.enable = true;
programs.zed-editor.enable = true;

That is the whole configuration. Both editors get rust-analyzer wired up with rustfmt on save and the right indentation, because both of them consume the same description.

Why editors are not the only consumers

Language servers used to be an editor concern. They are not anymore — coding agents such as OpenCode and Claude Code benefit from exactly the same information, because “which LSP understands this file, and what formats it” is a fact about the project, not about the program looking at it.

devix calls anything that consumes the description a consumer. An editor is a consumer. An AI harness is a consumer. Adding a new one does not require touching a single language definition.

Where to go next

Status

devix currently lives inside this flake as modules/devix, and is exported as homeModules.devix and devenvModules.*. It has no dependency on the rest of the configuration: the language definitions use plain nixpkgs, so the module works against a stock home-manager setup. If it outgrows this repository it can move out as-is.