Skip to content

Contributing ​

Open an issue or a pull request in the repository your change belongs to. Search its issues and pull requests first.

Follow the Code of Conduct. Report vulnerabilities privately through the security policy.

Project map ​

RepositoryHoldsHow to work on it
clientlimanix, the command on the Mac, and the model of limanix.tomlDevelopment
lmxlmx and its daemon lmxd, inside every VMDevelopment
modulesThe catalog of shells, toolchains and modules, its themes and prompts, and the base diskDevelopment and the catalog contract
sitelimanix.dev and docs.limanix.devDevelopment
.githubThis guide, the security and conduct policies, the issue and pull request templates, and the organization profileSet up

An arrow points from the repository that publishes something to the one that reads it.

A client release bundles one catalog release: its modules, interface.nix, platform.nix, flake.lock and the manifest of the base disk. It also pins one lmx release in internal/nixos/resources/base/lmx.json. Every system the client generates installs that lmx and lmxd and writes their configuration and help cards to /etc/lmx/config.json and /etc/lmx/help.json. The client then runs lmx <command> --json over SSH and reads the answer through a versioned host contract. How it works shows what runs where.

Issues ​

New issue offers the same forms in every repository.

FormUse it forInclude
Bug reportBehavior you did not expectThe versions, the smallest steps that reproduce it, and the logs, without credentials or private data
Feature requestA capability you missThe problem and the use case first; a configuration or command example is optional
DocumentationMissing, unclear or outdated contentThe page URL or file path
QuestionHow something worksWhat you are trying to do and what is unclear

limanix --version on the Mac and lmx version in the VM show the versions. The client's release page names the catalog it bundles. What the site reads shows which repository owns a page of the docs.

Set up ​

Every repository uses Task 3.53.1 or newer (installation) and Docker: the ci/* tasks run in the containers CI uses. In a repository directory, task -l lists its tasks, and its README explains them under Development.

In .github, task ci/markdown/fmt checks the Markdown files and task markdown/fix formats them.

Pull requests ​

  1. For anything beyond a small fix, open an issue first and agree on the approach before coding.
  2. Keep a pull request to one change, with its tests and documentation.
  3. Run the checks of the repository. Its Development section lists them.
  4. Title it with a prefix from the table, such as [fix] Go: put ~/go/bin on PATH. A pull request merges by squash: the title becomes the commit on main and a line in the release notes.
  5. Add a release label. If you cannot add one, a maintainer adds it during review.
Release labelTitle prefixSection of the release notes
feature[feat]Features
bug[fix]Bug fixes
docs[docs]Documentation
tooling[tooling]Tooling
other[other]Other
depsNone; Dependabot and the update flow write these titlesDependencies
skipNoneLeft out of the release notes

A change to this list touches the labels of every repository, labels.yml and release.yml in each of them, the pull request template and this guide.

In client, lmx, modules and site, a pull request can merge when:

  • the required checks gate and check label pass; check label fails until a release label is applied;
  • its branch is up to date with main;
  • every review conversation is resolved.

Workflows of a first-time contributor's pull request wait for a maintainer to approve them.

Changes across repositories ​

Repositories read each other's published releases, not main. The client has no catalog pin: its pull requests and releases build with the newest published catalog. The order of a change matters.

ChangeOrderWhat fails meanwhile
A catalog option, capability or metadata field that the client readsRelease the catalog, then merge the client pull request that uses itA client pull request opened first fails against the old catalog. After the release, a module.toml field the client does not know stops client builds with invalid module metadata until that pull request merges
A new theme or promptRelease the catalog. No client pull request is needed: a client takes them from the catalog it bundlesNothing
The configuration lmx reads, config.json and help.jsonRelease lmx, then one client pull request moves the pin in lmx.json and writes the new fieldlmx rejects unknown fields: a system that writes the field first fails to build
The host contractFollow the rules for changing it. Release lmx, then one client pull request moves the pin and reads the changeA client stops on a version it does not read: lmx answered with host contract N
A new command, a new limanix.toml table or a new field in reference.jsonUpdate reference.json with task reference/fix, release the project, then add the page in site. lmx reaches the site through the client that pins itA site page that includes a region absent from the selected release fails with no region. New source fields and unused generated regions do not by themselves fail the site build

To check a change before its release, build against your checkouts: modules_source=../modules and lmx_source=../lmx in the tasks of client, and MODULES_ROOT, CLIENT_ROOT, LMX_ROOT and ORG_ROOT in the docs build of site.

What the site reads ​

On the siteSourceVersion
Module pages, the catalog graph, the previews of themes and promptscatalog/ and previews/ in modulesThe latest release
The reference of limanix and limanix.tomlreference.json in clientThe latest release
The reference of lmxreference.json in lmxThe release the latest client pins
This guideCONTRIBUTING.md in .githubmain
Every other pagedocs/pages and app/ in siteThe tagged commit

The site reads these when it builds, and it deploys only from a tag of site. A release elsewhere reaches docs.limanix.dev with the next tag.

Releases ​

RepositoryWhat starts a releaseWhat it publishes
clientA maintainer tags v<version> on mainBinaries built with the newest published catalog
clientEach catalog releaseThe newest client release again as v<version>+<N>, with that catalog. A client that cannot read the catalog fails the run and stays as it is
lmxA maintainer tags v<version> on main, matching the version in Cargo.tomlArchives for aarch64 and x86_64
modulesA tag v<N> on main. The Tag flow creates it when flake.lock or catalog/_shared/unstable.toml changes; a maintainer creates it for anything elseThe catalog and its base disks, then the modules-release event to client
siteA maintainer tags v<version> on mainlimanix.dev and docs.limanix.dev
.githubA merge to mainTakes effect on GitHub at once

Release tags cannot be moved or deleted: fix a bad release with the next one.

License ​

LimaNix projects are licensed under Apache-2.0. By contributing, you agree that your contribution is licensed under the same terms.

Free and open source under the Apache License 2.0.