RIME: API for SemVer flake inputs from all major forges

Hi everyone,

I’ve started working on a FOSS, AGPLv3 API to easily deal with flake inputs not having a notion of semantic versioning. This is easily self hosted, we provide a nix package and a container via our flake, as well as a docker container on ghrc Package rime · GitHub.

The value it delivers is simple: your flake inputs can easily be the latest released version from a forge. It doesn’t even require those forges to follow semver. This is something I’ve myself wanted as an application developer for my own projects that relies heavily on flakes.

We currently support this for Github, self hosted Gitea, self hosted Forgejo, and Codeberg. We plan to expand support to Gitlab, Github EE, and whatever other forges people want to contribute.

We also support flakehub, but only getting a specific flake version.

We host this API on http://rime.cx, although the latest version with support for more than github won’t be deployed on it until thursday when we next release. The api also won’t be promised to be reliable yet, as we are iterating rapidly on it at the moment.

A current known issue is we don’t differentiate between normal releases and releases tagged a pre-release, we will in the future. Right now the project is only 3 days old, so we simply haven’t gotten to it yet.

We might also make some fancy frontend, but it isn’t a priority. We have the unique advantage of not requiring flakes to be registered, so we think we could do something cool here.

Link: GitHub - cafkafk/rime: Nix Flake Input Versioning

EDIT: I couldn’t wait until the scheduled thursday release, and cut a release early.

We just release v0.1.1, bringing gitlab (including self hosted), codeberg, forgejo, gitea, and version pinned flakehub support.

It also adds automatic discovery, allowing you to run e.g. nix run 'http://rime.cx/v1/git.madhouse-project.org/algernon/riemann-c-client.tar.gz' without specifying the type of forge.

All of this is currently live via rime.cx, or you can self host it if you so desire.


I’m not sure I understand how this works from your description here and in the rEADME, and unfortunately I haven’t got the time to look at the code.

Could you add a section to the README explaining how it works? The asciicast is too fast IMO.

The tl;dr is you use /api/v1/<forge>/<owner>/<repo>.tar.gz as an input and get the latest “proper” release from a repository. We do this simply by performing some inexpensive logic and redirecting you to the right endpoint on the forge (e.g. getting the tag from the latest release and redirecting you to that tags tarball). We also have endpoints for versions, tags, branches and such, but that’s something nix can do natively anyways.


I’ve reworked the readme, hopefully it’s more clear now (albeit a lot longer)