2023-09-06 15:12:47 +00:00
# The Determinate Nix Installer
2023-08-23 01:14:41 +00:00
2023-01-10 15:44:55 +00:00
[![Crates.io ](https://img.shields.io/crates/v/nix-installer )](https://crates.io/crates/nix-installer)
[![Docs.rs ](https://img.shields.io/docsrs/nix-installer )](https://docs.rs/nix-installer/latest/nix_installer/)
2022-10-06 19:21:49 +00:00
2023-09-06 15:12:47 +00:00
A fast, friendly, and reliable tool to help you use Nix with Flakes everywhere.
2022-09-10 20:23:10 +00:00
2023-01-12 17:37:20 +00:00
```bash
2023-01-18 18:09:21 +00:00
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
2023-01-12 17:37:20 +00:00
```
2022-12-07 01:59:25 +00:00
2023-09-06 15:12:47 +00:00
The `nix-installer` has successfully completed over 500,000 installs in a number of environments, including [Github Actions ](#as-a-github-action ):
2022-10-06 19:21:49 +00:00
2023-02-24 17:27:00 +00:00
| Platform | Multi User | `root` only | Maturity |
|------------------------------|:------------------:|:-----------:|:-----------------:|
| Linux (x86_64 & aarch64) | ✓ (via [systemd]) | ✓ | Stable |
| MacOS (x86_64 & aarch64) | ✓ | | Stable (See note) |
| Valve Steam Deck (SteamOS) | ✓ | | Stable |
| WSL2 (x86_64 & aarch64) | ✓ (via [systemd]) | ✓ | Stable |
| Podman Linux Containers | ✓ (via [systemd]) | ✓ | Stable |
| Docker Containers | | ✓ | Stable |
| Linux (i686) | ✓ (via [systemd]) | ✓ | Unstable |
2023-03-16 17:08:27 +00:00
> **Note**
> On **MacOS only**, removing users and/or groups may fail if there are no users who are logged in graphically.
2022-10-06 19:21:49 +00:00
2023-01-12 17:37:20 +00:00
## Usage
2022-10-06 19:21:49 +00:00
2023-01-12 17:37:20 +00:00
Install Nix with the default planner and options:
2022-10-06 19:21:49 +00:00
```bash
2023-01-18 18:09:21 +00:00
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
2022-10-06 19:21:49 +00:00
```
2023-01-12 17:37:20 +00:00
Or, to download a platform specific Installer binary yourself:
2022-10-06 19:21:49 +00:00
2022-12-12 20:56:37 +00:00
```bash
2023-01-12 17:37:20 +00:00
$ curl -sL -o nix-installer https://install.determinate.systems/nix/nix-installer-x86_64-linux
$ chmod +x nix-installer
2023-09-06 15:12:47 +00:00
$ ./nix-installer
2022-12-12 20:56:37 +00:00
```
2022-12-19 18:26:58 +00:00
`nix-installer` installs Nix by following a *plan* made by a *planner* . Review the available planners:
2022-09-10 20:23:10 +00:00
2022-10-06 19:21:49 +00:00
```bash
2022-12-19 18:26:58 +00:00
$ ./nix-installer install --help
2022-12-12 20:56:37 +00:00
Execute an install (possibly using an existing plan)
2022-12-19 18:26:58 +00:00
To pass custom options, select a planner, for example `nix-installer install linux-multi --help`
2022-12-12 20:56:37 +00:00
2022-12-19 18:26:58 +00:00
Usage: nix-installer install [OPTIONS] [PLAN]
nix-installer install < COMMAND >
2022-12-12 20:56:37 +00:00
Commands:
2023-02-10 20:35:00 +00:00
linux
A planner for Linux installs
2022-12-12 20:56:37 +00:00
steam-deck
2023-02-10 20:35:00 +00:00
A planner suitable for the Valve Steam Deck running SteamOS
2022-12-12 20:56:37 +00:00
help
Print this message or the help of the given subcommand(s)
# ...
```
Planners have their own options and defaults, sharing most of them in common:
2022-11-01 16:32:14 +00:00
2022-12-12 20:56:37 +00:00
```bash
2023-02-10 20:35:00 +00:00
$ ./nix-installer install linux --help
A planner for Linux installs
2022-12-12 20:56:37 +00:00
2023-02-10 20:35:00 +00:00
Usage: nix-installer install linux [OPTIONS]
2022-12-12 20:56:37 +00:00
Options:
2023-01-12 17:37:20 +00:00
# ...
2023-02-01 20:35:52 +00:00
--nix-build-group-name < NIX_BUILD_GROUP_NAME >
The Nix build group name
2023-01-09 18:59:53 +00:00
2023-02-01 20:35:52 +00:00
[env: NIX_INSTALLER_NIX_BUILD_GROUP_NAME=]
[default: nixbld]
2023-01-09 18:59:53 +00:00
2023-02-01 20:35:52 +00:00
--nix-build-group-id < NIX_BUILD_GROUP_ID >
The Nix build group GID
2023-01-09 18:59:53 +00:00
2023-02-01 20:35:52 +00:00
[env: NIX_INSTALLER_NIX_BUILD_GROUP_ID=]
2023-01-09 18:59:53 +00:00
[default: 3000]
2023-01-12 17:37:20 +00:00
# ...
2022-10-06 19:21:49 +00:00
```
2022-09-10 20:23:10 +00:00
2023-01-12 17:37:20 +00:00
Planners can be configured via environment variable or command arguments:
2022-09-10 20:23:10 +00:00
2022-12-12 20:56:37 +00:00
```bash
2023-02-01 20:35:52 +00:00
$ curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | NIX_BUILD_GROUP_NAME=nixbuilder sh -s -- install linux-multi --nix-build-group-id 4000
2023-01-12 17:37:20 +00:00
# Or...
2023-02-01 20:35:52 +00:00
$ NIX_BUILD_GROUP_NAME=nixbuilder ./nix-installer install linux-multi --nix-build-group-id 4000
2022-12-12 20:56:37 +00:00
```
2022-11-01 16:32:14 +00:00
2023-09-06 18:20:37 +00:00
### Upgrading Nix
You can upgrade Nix (to the version specified [here ](https://raw.githubusercontent.com/NixOS/nixpkgs/master/nixos/modules/installer/tools/nix-fallback-paths.nix )) by running:
```
2023-09-13 16:56:00 +00:00
sudo -i nix upgrade-nix
2023-09-06 18:20:37 +00:00
```
Alternatively, you can [uninstall ](#uninstalling ) and [reinstall ](#usage ) with a different version of the `nix-installer` .
2023-01-12 17:37:20 +00:00
2023-09-06 15:12:47 +00:00
### Uninstalling
2022-11-01 16:32:14 +00:00
2022-12-19 18:26:58 +00:00
You can remove a `nix-installer` -installed Nix by running
2022-11-01 16:32:14 +00:00
```bash
2022-12-19 18:26:58 +00:00
/nix/nix-installer uninstall
2022-11-01 16:32:14 +00:00
```
2022-12-16 18:55:28 +00:00
2023-09-06 15:12:47 +00:00
### As a Github Action
2022-12-16 18:55:28 +00:00
2023-01-13 21:26:15 +00:00
You can use the [`nix-installer-action` ](https://github.com/DeterminateSystems/nix-installer-action ) Github Action like so:
2022-12-16 18:55:28 +00:00
```yaml
on:
pull_request:
push:
branches: [main]
jobs:
lints:
name: Build
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: Install Nix
2023-01-17 18:51:47 +00:00
uses: DeterminateSystems/nix-installer-action@main
2022-12-16 18:55:28 +00:00
- name: Run `nix build`
run: nix build .
2022-12-19 18:26:58 +00:00
```
2023-01-12 17:37:20 +00:00
2023-09-06 15:12:47 +00:00
### Without systemd (Linux only)
2023-03-13 21:12:33 +00:00
> **Warning**
2023-03-16 17:08:27 +00:00
> When `--init none` is used, _only_ `root` or users who can elevate to `root` privileges can run Nix:
2023-03-13 21:12:33 +00:00
>
> ```bash
> sudo -i nix run nixpkgs#hello
> ```
If you don't use [systemd], you can still install Nix by explicitly specifying the `linux` plan and `--init none` :
```bash
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --init none
```
2023-09-06 15:12:47 +00:00
### In a container
2023-01-12 17:37:20 +00:00
2023-03-08 18:30:31 +00:00
In Docker/Podman containers or WSL2 instances where an init (like `systemd` ) is not present, pass `--init none` .
2023-02-01 20:35:52 +00:00
2023-05-18 17:14:03 +00:00
For containers (without an init):
2023-03-16 17:08:27 +00:00
> **Warning**
> When `--init none` is used, _only_ `root` or users who can elevate to `root` privileges can run Nix:
2023-02-01 20:35:52 +00:00
>
> ```bash
> sudo -i nix run nixpkgs#hello
> ```
```dockerfile
# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl -y
2023-05-18 17:14:03 +00:00
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--init none \
--no-confirm
2023-02-01 20:35:52 +00:00
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
```
2023-05-18 17:14:03 +00:00
```bash
docker build -t ubuntu-with-nix .
docker run --rm -ti ubuntu-with-nix
docker rmi ubuntu-with-nix
# or
podman build -t ubuntu-with-nix .
podman run --rm -ti ubuntu-with-nix
podman rmi ubuntu-with-nix
2023-02-01 20:35:52 +00:00
```
2023-05-18 17:14:03 +00:00
For containers with a systemd init:
2023-02-01 20:35:52 +00:00
```dockerfile
# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl systemd -y
2023-05-18 17:14:03 +00:00
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--no-start-daemon \
--no-confirm
2023-02-01 20:35:52 +00:00
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
2023-05-18 17:14:03 +00:00
CMD [ "/bin/systemd" ]
2023-02-01 20:35:52 +00:00
```
2023-05-18 17:14:03 +00:00
```bash
podman build -t ubuntu-systemd-with-nix .
IMAGE=$(podman create ubuntu-systemd-with-nix)
CONTAINER=$(podman start $IMAGE)
podman exec -ti $CONTAINER /bin/bash
podman rm -f $CONTAINER
podman rmi $IMAGE
```
On some container tools, such as `docker` , `sandbox = false` can be omitted. Omitting it will negatively impact compatibility with container tools like `podman` .
2023-09-06 15:12:47 +00:00
### In WSL2
We **strongly recommend** [enabling systemd ](https://ubuntu.com/blog/ubuntu-wsl-enable-systemd ), then installing Nix as normal:
2023-02-01 20:35:52 +00:00
```bash
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
```
2023-09-06 15:12:47 +00:00
If [WSLg][wslg] is enabled, you can do things like open a Linux Firefox from Windows on Powershell:
```powershell
wsl nix run nixpkgs#firefox
```
To use some OpenGL applications, you can use [`nixGL`][nixgl] (note that some applications, such as `blender` , may not work):
```powershell
wsl nix run --impure github:guibou/nixGL nix run nixpkgs#obs-studio
```
If enabling system is not an option, pass `--init none` at the end of the command:
2023-02-01 20:35:52 +00:00
2023-03-16 17:08:27 +00:00
> **Warning**
> When `--init none` is used, _only_ `root` or users who can elevate to `root` privileges can run Nix:
2023-02-01 20:35:52 +00:00
>
> ```bash
> sudo -i nix run nixpkgs#hello
> ```
```bash
2023-02-10 20:35:00 +00:00
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --init none
2023-02-01 20:35:52 +00:00
```
2023-09-06 15:12:47 +00:00
### Skip confirmation
2023-02-21 15:27:21 +00:00
If you'd like to bypass the confirmation step, you can apply the `--no-confirm` flag:
```bash
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm
```
This is especially useful when using the installer in non-interactive scripts.
2023-09-06 15:12:47 +00:00
## Quirks
While `nix-installer` tries to provide a comprehensive and unquirky experience, there are unfortunately some issues which may require manual intervention or operator choices.
### Using MacOS remote SSH builders, Nix binaries are not on `$PATH`
When connecting to a Mac remote SSH builder users may sometimes see this error:
```bash
$ nix store ping --store "ssh://$USER@$HOST"
Store URL: ssh://$USER@$HOST
zsh:1: command not found: nix-store
error: cannot connect to '$USER@$HOST'
```
The way MacOS populates the `PATH` environment differs from other environments. ([Some background](https://gist.github.com/Linerre/f11ad4a6a934dcf01ee8415c9457e7b2))
There are two possible workarounds for this:
* **(Preferred)** Update the remote builder URL to include the `remote-program` parameter pointing to `nix-store` . For example:
```bash
nix store ping --store "ssh://$USER@$HOST?remote-program=/nix/var/nix/profiles/default/bin/nix-store"
```
If you are unsure where the `nix-store` binary is located, run `which nix-store` on the remote.
* Update `/etc/zshenv` on the remote so that `zsh` populates the Nix path for every shell, even those that are neither *interactive* or *login* :
```bash
# Nix
if [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then
. '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'
fi
# End Nix
```
< details >
< summary > This strategy has some behavioral caveats, namely, < code > $PATH< / code > may have unexpected contents< / summary >
For example, if `$PATH` gets unset then a script invoked, `$PATH` may not be as empty as expected:
```bash
$ cat example.sh
#! /bin/zsh
echo $PATH
$ PATH= ./example.sh
/Users/ephemeraladmin/.nix-profile/bin:/nix/var/nix/profiles/default/bin:
```
This strategy results in Nix's paths being present on `$PATH` twice and may have a minor impact on performance.
< / details >
2023-02-01 20:35:52 +00:00
## Building a binary
2023-01-12 17:37:20 +00:00
Since you'll be using `nix-installer` to install Nix on systems without Nix, the default build is a static binary.
2023-02-01 20:35:52 +00:00
Build a portable Linux binary on a system with Nix:
2023-01-12 17:37:20 +00:00
```bash
2023-03-16 16:24:13 +00:00
# to build a local copy
2023-03-16 17:08:27 +00:00
nix build -L ".#nix-installer-static"
2023-03-16 16:24:13 +00:00
# to build the remote main development branch
2023-03-16 17:08:27 +00:00
nix build -L "github:determinatesystems/nix-installer#nix-installer-static"
2023-03-16 16:24:13 +00:00
# for a specific version of the installer:
2023-03-20 17:31:58 +00:00
export NIX_INSTALLER_TAG="v0.6.0"
2023-03-16 17:08:27 +00:00
nix build -L "github:determinatesystems/nix-installer/$NIX_INSTALLER_TAG#nix-installer-static"
2023-01-12 17:37:20 +00:00
```
2023-02-01 20:35:52 +00:00
On Mac:
```bash
2023-03-16 16:24:13 +00:00
# to build a local copy
2023-03-16 17:08:27 +00:00
nix build -L ".#nix-installer"
2023-03-16 16:24:13 +00:00
# to build the remote main development branch
2023-03-16 17:08:27 +00:00
nix build -L "github:determinatesystems/nix-installer#nix-installer"
2023-03-16 16:24:13 +00:00
# for a specific version of the installer:
2023-03-20 17:31:58 +00:00
export NIX_INSTALLER_TAG="v0.6.0"
2023-03-16 17:08:27 +00:00
nix build -L "github:determinatesystems/nix-installer/$NIX_INSTALLER_TAG#nix-installer"
2023-02-01 20:35:52 +00:00
```
2023-01-12 17:37:20 +00:00
Then copy the `result/bin/nix-installer` to the machine you wish to run it on.
2023-09-06 15:12:47 +00:00
You can also add `nix-installer` to a system without Nix via `cargo` , there are no system dependencies to worry about:
2023-01-12 17:37:20 +00:00
```bash
2023-03-16 16:24:13 +00:00
# to build and run a local copy
RUSTFLAGS="--cfg tokio_unstable" cargo run -- --help
# to build the remote main development branch
RUSTFLAGS="--cfg tokio_unstable" cargo install --git https://github.com/DeterminateSystems/nix-installer
nix-installer --help
# for a specific version of the installer:
2023-03-20 17:31:58 +00:00
export NIX_INSTALLER_TAG="v0.6.0"
2023-03-16 16:24:13 +00:00
RUSTFLAGS="--cfg tokio_unstable" cargo install --git https://github.com/DeterminateSystems/nix-installer --tag $NIX_INSTALLER_TAG
2023-01-12 17:37:20 +00:00
nix-installer --help
```
To make this build portable, pass ` --target x86_64-unknown-linux-musl` .
2023-03-16 17:08:27 +00:00
> **Note**
2023-01-12 17:37:20 +00:00
> We currently require `--cfg tokio_unstable` as we utilize [Tokio's process groups](https://docs.rs/tokio/1.24.1/tokio/process/struct.Command.html#method.process_group), which wrap stable `std` APIs, but are unstable due to it requiring an MSRV bump.
## As a library
2023-03-16 17:08:27 +00:00
> **Warning**
2023-09-06 15:12:47 +00:00
> Use as a library is still experimental. This feature is likely to be removed in the future without an advocate. If you're using this, please let us know and we can make a path to stablization.
2023-02-13 22:07:35 +00:00
2023-01-12 17:37:20 +00:00
Add `nix-installer` to your dependencies:
```bash
cargo add nix-installer
```
2023-03-16 17:08:27 +00:00
If you are **building a CLI** , check out the `cli` feature flag for `clap` integration.
2023-01-12 17:37:20 +00:00
2023-02-01 20:35:52 +00:00
You'll also need to edit your `.cargo/config.toml` to use `tokio_unstable` as we utilize [Tokio's process groups ](https://docs.rs/tokio/1.24.1/tokio/process/struct.Command.html#method.process_group ), which wrap stable `std` APIs, but are unstable due to it requiring an MSRV bump:
2023-01-12 17:37:20 +00:00
```toml
# .cargo/config.toml
[build]
rustflags=["--cfg", "tokio_unstable"]
```
Then it's possible to review the [documentation ](https://docs.rs/nix-installer/latest/nix_installer/ ):
```bash
cargo doc --open -p nix-installer
```
Documentation is also available via `nix` build:
```bash
nix build github:DeterminateSystems/nix-installer#nix-installer.doc
firefox result-doc/nix-installer/index.html
```
2023-02-01 20:35:52 +00:00
2023-03-29 19:18:45 +00:00
## Accessing other versions
For users who desire version pinning, the version of `nix-installer` to use can be specified in the `curl` command:
```bash
VERSION="v0.6.0"
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix/tag/${VERSION} | sh -s -- install
```
To discover which versions are available, or download the binaries for any release, check the [Github Releases ](https://github.com/DeterminateSystems/nix-installer/releases ).
These releases can be downloaded and used directly:
```bash
VERSION="v0.6.0"
ARCH="aarch64-linux"
curl -sSf -L https://github.com/DeterminateSystems/nix-installer/releases/download/${VERSION}/nix-installer-${ARCH} -o nix-installer
./nix-installer install
```
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
## Installation Differences
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
Differing from the upstream [Nix ](https://github.com/NixOS/nix ) installer scripts:
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
* In `nix.conf` :
2023-09-22 17:44:40 +00:00
+ the `nix-command` and `flakes` features are enabled
2023-09-06 15:12:47 +00:00
+ `bash-prompt-prefix` is set
+ `auto-optimise-store` is set to `true` (On Linux only)
* `extra-nix-path` is set to `nixpkgs=flake:nixpkgs`
* an installation receipt (for uninstalling) is stored at `/nix/receipt.json` as well as a copy of the install binary at `/nix/nix-installer`
* `nix-channel --update` is not run, `~/.nix-channels` is not provisioned
2023-10-10 16:21:22 +00:00
* `ssl-cert-file` is set in `/etc/nix/nix.conf` if the `ssl-cert-file` argument is used.
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
## Motivations
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
The existing upstream scripts do a good job, however they are difficult to maintain.
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
Subtle differences in the shell implementations and tool used in the scripts make it difficult to make meaningful changes to the installer.
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
The Determinate Nix installer has numerous advantages:
2023-03-16 16:39:49 +00:00
2023-09-06 15:12:47 +00:00
* keeping an installation receipt for easy uninstallation
* offering users a chance to review an accurate, calculated install plan
* having 'planners' which can create appropriate install plans for complicated targets
* offering users with a failing install the chance to do a best-effort revert
* improving performance by maximizing parallel operations
* supporting a expanded test suite including 'curing' cases
* supporting SELinux and OSTree based distributions without asking users to make compromises
* operating as a single, static binary with external dependencies such as `openssl` , only calling existing system tools (like `useradd` ) where necessary
It has been wonderful to collaborate with other participants in the Nix Installer Working Group and members of the broader community. The working group maintains a [foundation owned fork of the installer ](https://github.com/nixos/experimental-nix-installer/ ).
2023-03-16 16:39:49 +00:00
2023-02-27 15:49:40 +00:00
## Diagnostics
The goal of the Determinate Nix Installer is to successfully and correctly install Nix.
The `curl | sh` pipeline and the installer collects a little bit of diagnostic information to help us make that true.
Here is a table of the [diagnostic data we collect][diagnosticdata]:
| Field | Use |
| --------------------- | ----------------------------------------------------------------------------------------------------- |
| `version` | The version of the Determinate Nix Installer. |
| `planner` | The method of installing Nix (`linux`, `macos` , `steam-deck` ) |
| `configured_settings` | The names of planner settings which were changed from their default. Does _not_ include the values. |
| `os_name` | The running operating system. |
| `os_version` | The version of the operating system. |
| `triple` | The architecture/operating system/binary format of your system. |
| `is_ci` | Whether the installer is being used in CI (e.g. GitHub Actions). |
| `action` | Either `Install` or `Uninstall` . |
| `status` | One of `Success` , `Failure` , `Pending` , or `Cancelled` . |
2023-09-20 18:23:23 +00:00
| `attribution` | Optionally defined by the user, associate the diagnostics of this run to the provided value. |
2023-03-16 16:39:49 +00:00
| `failure_chain` | A high level description of what the failure was, if any. For example: `Command("diskutil")` if the command `diskutil list` failed. |
2023-02-27 15:49:40 +00:00
To disable diagnostic reporting, set the diagnostics URL to an empty string by passing `--diagnostic-endpoint=""` or setting `NIX_INSTALLER_DIAGNOSTIC_ENDPOINT=""` .
You can read the full privacy policy for [Determinate Systems][detsys], the creators of the Determinate Nix Installer, [here][privacy].
[detsys]: https://determinate.systems/
[diagnosticdata]: https://github.com/DeterminateSystems/nix-installer/blob/f9f927840d532b71f41670382a30cfcbea2d8a35/src/diagnostics.rs#L29-L43
[privacy]: https://determinate.systems/privacy
[systemd]: https://systemd.io
2023-09-06 15:12:47 +00:00
[wslg]: https://github.com/microsoft/wslg
2023-10-10 16:21:22 +00:00
[nixgl]: https://github.com/guibou/nixGL