Skip to content

Build instructions for Linux (English) seem to be wrong #631

Description

@troyrollo

Following the English language build instructions at https://rustdesk.com/docs/en/dev/build/linux/ using a new account with an empty home directory on Linux (Debian Trixie) does not work. Initially it returns an error on the last "vcpkg" command:

rustdesk-build@constitution:~$ ls -sal
total 8
4 drwx------  2 rustdesk-build rustdesk-build 4096 Aug  5 10:00 .
4 drwxr-xr-x 10 root           root           4096 Aug  5 09:48 ..
rustdesk-build@constitution:~$ 
logout
troy@constitution:~$ sudo su - rustdesk-build
rustdesk-build@constitution:~$ git clone --recurse-submodules https://github.com/microsoft/vcpkg
Cloning into 'vcpkg'...
remote: Enumerating objects: 334526, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 334526 (delta 4), reused 5 (delta 0), pack-reused 334509 (from 1)
Receiving objects: 100% (334526/334526), 108.01 MiB | 11.46 MiB/s, done.
Resolving deltas: 100% (222957/222957), done.
rustdesk-build@constitution:~$ cd vcpkg
rustdesk-build@constitution:~/vcpkg$ git checkout 2023.10.19
Note: switching to '2023.10.19'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 8eb57355a4 add mips64-linux to triplets/community (#34392)
rustdesk-build@constitution:~/vcpkg$ cd ..
rustdesk-build@constitution:~$ vcpkg/bootstrap-vcpkg.sh
Downloading vcpkg-glibc...
vcpkg package management program version 2023-10-18-27de5b69dac4b6fe8259d283cd4011e6d20a84ce

See LICENSE.txt for license information.
Telemetry
---------
vcpkg collects usage data in order to help us improve your experience.
The data collected by Microsoft is anonymous.
You can opt-out of telemetry by re-running the bootstrap-vcpkg script with -disableMetrics,
passing --disable-metrics to vcpkg on the command line,
or by setting the VCPKG_DISABLE_METRICS environment variable.

Read more about vcpkg telemetry at docs/about/privacy.md
rustdesk-build@constitution:~$ export VCPKG_ROOT=$PWD/vcpkg
rustdesk-build@constitution:~$ vcpkg/vcpkg install --x-install-root="$VCPKG_ROOT/installed"
error: `vcpkg install` requires a list of packages to install in classic mode.
Synopsis: Installs a package
Examples:
  vcpkg install <port name> <port name>...
  vcpkg install zlib zlib:x64-windows curl boost
See https://learn.microsoft.com/vcpkg/commands/install for more information.
Options:
  --allow-unsupported    Continues with a warning on unsupported ports, rather than failing
  --x-asset-sources=...  Asset caching sources. See 'vcpkg help assetcaching'
  --binarysource=...     Binary caching sources. See 'vcpkg help binarycaching'
  --x-buildtrees-root=...
                         Buildtrees directory (experimental)
  --clean-after-build    Cleans buildtrees, packages and downloads after building each package
  --clean-buildtrees-after-build
                         Cleans buildtrees after building each package
  --clean-downloads-after-build
                         Cleans downloads after building each package
  --clean-packages-after-build
                         Cleans packages after building each package
  --downloads-root=...   Downloads directory (default: $VCPKG_DOWNLOADS)
  --dry-run              Does not actually build or install
  --editable             Disables source re-extraction and binary caching for libraries on the
                         command line (classic mode)
  --enforce-port-checks  Fails install if a port has detected problems or attempts to use a
                         deprecated feature
  --x-feature=...        Additional features from the top-level manifest to install (manifest mode)
  --head                 Installs the libraries on the command line using the latest upstream
                         sources (classic mode)
  --host-triplet=...     Host triplet. See 'vcpkg help triplet' (default:
                         $VCPKG_DEFAULT_HOST_TRIPLET)
  --x-install-root=...   Installed directory (experimental)
  --keep-going           Continues installing packages on failure
  --x-no-default-features
                         Does not install the default features from the top-level manifest (manifest
                         mode)
  --no-downloads         Does not download new sources
  --no-print-usage       Does not print CMake usage information after install
  --only-binarycaching   Fails if cached binaries are not available
  --only-downloads       Makes best-effort attempt to download sources without building
  --overlay-ports=...    Directories of overlay ports (also: $VCPKG_OVERLAY_PORTS)
  --overlay-triplets=... Directories of overlay triplets (also: $VCPKG_OVERLAY_TRIPLETS)
  --x-packages-root=...  Packages directory (experimental)
  --recurse              Allows removal of packages as part of installation
  --triplet=...          Target triplet. See 'vcpkg help triplet' (default: $VCPKG_DEFAULT_TRIPLET)
  --x-use-aria2          Uses aria2 to perform download tasks
  --vcpkg-root=...       The vcpkg root directory (default: $VCPKG_ROOT)
  --x-write-nuget-packages-config=...
                         Writes a NuGet packages.config-formatted file for use with external binary
                         caching. See `vcpkg help binarycaching` for more information

rustdesk-build@constitution:~$ 

First work-around attempt was to adjust that command to give it something to install:

rustdesk-build@constitution:~$ vcpkg/vcpkg install --x-install-root="$VCPKG_ROOT/installed" libvpx libyuv opus aom
Computing installation plan...
...

This results in the named packages being installed/built without error. Moving on to the next section:

rustdesk-build@constitution:~$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer
warn: It looks like you have an existing installation of Rust at:
warn: /usr/bin
warn: It is recommended that rustup be the primary Rust installation.
warn: Otherwise you may have confusion unless you are careful with your PATH.
warn: If you are sure that you want both rustup and your already installed Rust
warn: then please reply `y' or `yes' or set RUSTUP_INIT_SKIP_PATH_CHECK to yes
warn: or pass `-y' to ignore all ignorable checks.
error: cannot install while Rust is installed

Continue? (y/N) y

warn: It looks like you have an existing rustup settings file at:
warn: /home/rustdesk-build/.rustup/settings.toml
warn: Rustup will install the default toolchain as specified in the settings file,
warn: instead of the one inferred from the default host triple.

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /home/rustdesk-build/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /home/rustdesk-build/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /home/rustdesk-build/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /home/rustdesk-build/.profile
  /home/rustdesk-build/.zshenv

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>

info: profile set to default
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for stable-x86_64-unknown-linux-gnu
info: latest update on 2026-07-16 for version 1.97.1 (8bab26f4f 2026-07-14)
info: downloading 6 components
        cargo installed                       10.63 MiB
       clippy installed                        4.71 MiB
    rust-docs installed                       22.73 MiB
     rust-std installed                       28.71 MiB
        rustc installed                       77.30 MiB
      rustfmt installed                        2.06 MiB                                                                                                                                       info: default toolchain set to stable-x86_64-unknown-linux-gnu

  stable-x86_64-unknown-linux-gnu installed - rustc 1.97.1 (8bab26f4f 2026-07-14)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.

This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish
source "~/.cargo/env.nu"  # For nushell
source "$HOME/.cargo/env.tcsh"  # For tcsh
. "$HOME/.cargo/env.ps1"        # For pwsh
source "$HOME/.cargo/env.xsh"   # For xonsh
rustdesk-build@constitution:~$ . "$HOME/.cargo/env"
rustdesk-build@constitution:~$ git clone --recurse-submodules https://github.com/rustdesk/rustdesk
Cloning into 'rustdesk'...
remote: Enumerating objects: 86428, done.
remote: Counting objects: 100% (167/167), done.
remote: Compressing objects: 100% (135/135), done.
remote: Total 86428 (delta 76), reused 32 (delta 32), pack-reused 86261 (from 3)
Receiving objects: 100% (86428/86428), 74.72 MiB | 11.46 MiB/s, done.
Resolving deltas: 100% (64652/64652), done.
Submodule 'libs/hbb_common' (https://github.com/rustdesk/hbb_common) registered for path 'libs/hbb_common'
Cloning into '/home/rustdesk-build/rustdesk/libs/hbb_common'...
remote: Enumerating objects: 1284, done.        
remote: Counting objects: 100% (786/786), done.        
remote: Compressing objects: 100% (72/72), done.        
remote: Total 1284 (delta 747), reused 714 (delta 714), pack-reused 498 (from 2)        
Receiving objects: 100% (1284/1284), 555.12 KiB | 6.94 MiB/s, done.
Resolving deltas: 100% (826/826), done.
Submodule path 'libs/hbb_common': checked out '69cea8dafee147848ae88702029f4bf7df7224c3'
rustdesk-build@constitution:~$ cd rustdesk
rustdesk-build@constitution:~/rustdesk$ mkdir -p target/debug
rustdesk-build@constitution:~/rustdesk$ wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
--2026-08-05 10:20:07--  https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8001::154, 2606:50c0:8002::154, 2606:50c0:8003::154, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|2606:50c0:8001::154|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10479944 (10.0M) [application/octet-stream]
Saving to: ‘libsciter-gtk.so’

libsciter-gtk.so                                100%[=====================================================================================================>]   9.99M  11.3MB/s    in 0.9s    

2026-08-05 10:20:08 (11.3 MB/s) - ‘libsciter-gtk.so’ saved [10479944/10479944]

rustdesk-build@constitution:~/rustdesk$ mv libsciter-gtk.so target/debug
rustdesk-build@constitution:~/rustdesk$ cargo run
    Updating crates.io index
    Updating git repository `https://github.com/rustdesk-org/hwcodec`
remote: Enumerating objects: 2825, done.
remote: Counting objects: 100% (637/637), done.
remote: Compressing objects: 100% (211/211), done.
remote: Total 2825 (delta 547), reused 426 (delta 426), pack-reused 2188 (from 2)
Receiving objects: 100% (2825/2825), 7.91 MiB | 11.16 MiB/s, done.
Resolving deltas: 100% (1509/1509), done.
From https://github.com/rustdesk-org/hwcodec
 * [new ref]         778df1f99597722473b29443bac22ae6c23946fe -> refs/commit/778df1f99597722473b29443bac22ae6c23946fe
    Updating git submodule `https://github.com/rustdesk-org/externals.git`
...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 14s
     Running `target/debug/rustdesk`

thread 'main' (3202716) panicked at /home/rustdesk-build/.cargo/git/checkouts/rust-sciter-9d95e9099df4ba27/5322f3a/src/capi/scdef.rs:160:14:
trying to construct an enum from an invalid value 0x84
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread caused non-unwinding panic. aborting.
Aborted

PATH and "which rustc" seem correct:

rustdesk-build@constitution:~/rustdesk$ echo $PATH
/home/rustdesk-build/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin
rustdesk-build@constitution:~/rustdesk$ which rustc
/home/rustdesk-build/.cargo/bin/rustc
rustdesk-build@constitution:~/rustdesk$ 

Attempting an alternative build with "./build.py --flutter" on a clean checkout of rustdesk also fails:

rustdesk-build@constitution:~/rustdesk$ ./build.py --flutter
features: ['flutter']
False
  Downloaded atomic v0.5.3
  Downloaded allo-isolate v0.1.25
  Downloaded dart-sys v4.1.5
  Downloaded build-target v0.4.0
...
   Compiling rustdesk v1.4.9 (/home/rustdesk-build/rustdesk)
warning: `scrap` (lib) generated 5 warnings (run `cargo fix --lib -p scrap` to apply 2 suggestions)
warning: `hbb_common` (lib) generated 1 warning (run `cargo fix --lib -p hbb_common` to apply 1 suggestion)
error[E0583]: file not found for module `bridge_generated`
  --> src/lib.rs:33:1
   |
33 | mod bridge_generated;
   | ^^^^^^^^^^^^^^^^^^^^^
   |
   = help: to create the module `bridge_generated`, create file "src/bridge_generated.rs" or "src/bridge_generated/mod.rs"
   = note: if there is a `mod bridge_generated` elsewhere in the crate already, import it with `use crate::...` instead

warning: unused imports: `allow_err` and `anyhow`
 --> src/server/wayland.rs:2:18
  |
2 | use hbb_common::{allow_err, anyhow, platform::linux::DISTRO};
  |                  ^^^^^^^^^  ^^^^^^
  |
  = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

warning: unused import: `crate::clipboard_file::*`
  --> src/server/connection.rs:12:5
   |
12 | use crate::clipboard_file::*;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^

warning: unused import: `is_installed`
  --> src/common.rs:42:69
   |
42 |     ui_interface::{get_api_server as ui_get_api_server, get_option, is_installed, set_option},
   |                                                                     ^^^^^^^^^^^^

warning: unused imports: `Duration` and `path::PathBuf`
  --> src/flutter_ffi.rs:26:5
   |
26 |     path::PathBuf,
   |     ^^^^^^^^^^^^^
...
31 |     time::{Duration, SystemTime},
   |            ^^^^^^^^

warning: unused import: `bail`
  --> src/ui_cm_interface.rs:14:16
   |
14 |     allow_err, bail,
   |                ^^^^

warning: use of deprecated function `hbb_common::whoami::hostname`: use `fallible::hostname()` instead
    --> src/platform/linux.rs:1750:47
     |
1750 |                 .replace(&hbb_common::whoami::hostname(), "")
     |                                               ^^^^^^^^
     |
     = note: `#[warn(deprecated)]` on by default

warning: use of deprecated function `hbb_common::base64::encode`: Use Engine::encode
   --> src/hbbs_http/sync.rs:187:52
    |
187 |                         hash = hbb_common::base64::encode(&res[..]);
    |                                                    ^^^^^^

error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
   --> src/flutter.rs:591:28
    |
591 |                     stream.add(EventToUI::Event(out.clone()));
    |                            ^^^ unsatisfied trait bound
    |
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
   --> src/flutter_ffi.rs:95:1
    |
 95 | pub enum EventToUI {
    | ^^^^^^^^^^^^^^^^^^
    = help: the following other types implement trait `IntoIntoDart<D>`:
              `()` implements `IntoIntoDart<()>`
              `(A, B)` implements `IntoIntoDart<(AD, BD)>`
              `(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
              `(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
              `(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
              `DartCObject` implements `IntoIntoDart<DartCObject>`
              `DartOpaque` implements `IntoIntoDart<DartOpaque>`
              `NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
            and 23 others
note: required by a bound in `StreamSink::<T>::add`
   --> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
    |
137 |     pub fn add<D: IntoDart>(&self, value: T) -> bool
    |            --- required by a bound in this associated function
138 |     where
139 |         T: IntoIntoDart<D>,
    |            ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`

error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
    --> src/flutter.rs:1239:24
     |
1239 |                 stream.add(EventToUI::Rgba(display));
     |                        ^^^ unsatisfied trait bound
     |
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
    --> src/flutter_ffi.rs:95:1
     |
  95 | pub enum EventToUI {
     | ^^^^^^^^^^^^^^^^^^
     = help: the following other types implement trait `IntoIntoDart<D>`:
               `()` implements `IntoIntoDart<()>`
               `(A, B)` implements `IntoIntoDart<(AD, BD)>`
               `(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
               `(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
               `(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
               `DartCObject` implements `IntoIntoDart<DartCObject>`
               `DartOpaque` implements `IntoIntoDart<DartOpaque>`
               `NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
             and 23 others
note: required by a bound in `StreamSink::<T>::add`
    --> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
     |
 137 |     pub fn add<D: IntoDart>(&self, value: T) -> bool
     |            --- required by a bound in this associated function
 138 |     where
 139 |         T: IntoIntoDart<D>,
     |            ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`

error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
    --> src/flutter.rs:1269:32
     |
1269 |                         stream.add(EventToUI::Texture(display, false));
     |                                ^^^ unsatisfied trait bound
     |
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
    --> src/flutter_ffi.rs:95:1
     |
  95 | pub enum EventToUI {
     | ^^^^^^^^^^^^^^^^^^
     = help: the following other types implement trait `IntoIntoDart<D>`:
               `()` implements `IntoIntoDart<()>`
               `(A, B)` implements `IntoIntoDart<(AD, BD)>`
               `(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
               `(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
               `(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
               `DartCObject` implements `IntoIntoDart<DartCObject>`
               `DartOpaque` implements `IntoIntoDart<DartOpaque>`
               `NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
             and 23 others
note: required by a bound in `StreamSink::<T>::add`
    --> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
     |
 137 |     pub fn add<D: IntoDart>(&self, value: T) -> bool
     |            --- required by a bound in this associated function
 138 |     where
 139 |         T: IntoIntoDart<D>,
     |            ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`

error[E0277]: the trait bound `EventToUI: IntoIntoDart<_>` is not satisfied
    --> src/flutter.rs:1438:16
     |
1438 |         stream.add(EventToUI::Event("close".to_owned()));
     |                ^^^ unsatisfied trait bound
     |
help: the trait `IntoIntoDart<_>` is not implemented for `EventToUI`
    --> src/flutter_ffi.rs:95:1
     |
  95 | pub enum EventToUI {
     | ^^^^^^^^^^^^^^^^^^
     = help: the following other types implement trait `IntoIntoDart<D>`:
               `()` implements `IntoIntoDart<()>`
               `(A, B)` implements `IntoIntoDart<(AD, BD)>`
               `(A, B, C)` implements `IntoIntoDart<(AD, BD, CD)>`
               `(A, B, C, D)` implements `IntoIntoDart<(AD, BD, CD, DD)>`
               `(A, B, C, D, E)` implements `IntoIntoDart<(AD, BD, CD, DD, ED)>`
               `DartCObject` implements `IntoIntoDart<DartCObject>`
               `DartOpaque` implements `IntoIntoDart<DartOpaque>`
               `NaiveDateTime` implements `IntoIntoDart<NaiveDateTime>`
             and 23 others
note: required by a bound in `StreamSink::<T>::add`
    --> /home/rustdesk-build/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/flutter_rust_bridge-1.80.1/src/rust2dart.rs:139:12
     |
 137 |     pub fn add<D: IntoDart>(&self, value: T) -> bool
     |            --- required by a bound in this associated function
 138 |     where
 139 |         T: IntoIntoDart<D>,
     |            ^^^^^^^^^^^^^^^ required by this bound in `StreamSink::<T>::add`

warning: variable does not need to be mutable
    --> src/flutter_ffi.rs:1045:9
     |
1045 |     let mut map: HashMap<String, String> = serde_json::from_str(&json).unwrap_or(HashMap::new());
     |         ----^^^
     |         |
     |         help: remove this `mut`
     |
     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default

warning: variable does not need to be mutable
   --> src/tray.rs:155:17
    |
155 |             let mut builder = TrayIconBuilder::new()
    |                 ----^^^^^^^
    |                 |
    |                 help: remove this `mut`

warning: variable does not need to be mutable
  --> src/tray.rs:63:9
   |
63 |     let mut event_loop = EventLoopBuilder::new().build();
   |         ----^^^^^^^^^^
   |         |
   |         help: remove this `mut`

warning: variable does not need to be mutable
   --> src/privacy_mode.rs:140:13
    |
140 |         let mut map: HashMap<&'static str, PrivacyModeCreator> = HashMap::new();
    |             ----^^^
    |             |
    |             help: remove this `mut`

Some errors have detailed explanations: E0277, E0583.
For more information about an error, try `rustc --explain E0277`.
warning: `rustdesk` (lib) generated 11 warnings
error: could not compile `rustdesk` (lib) due to 5 previous errors; 11 warnings emitted
Error occurred when executing: `cargo build --locked --features flutter --lib --release`. Exiting.
rustdesk-build@constitution:~/rustdesk$ 

Attempting to open a discussion in the development forum about this is entirely unproductive - they get almost immediately shut down with a comment linking to rustdesk/rustdesk#763, which ultimately references the non-working instructions at https://rustdesk.com/docs/en/dev/build/linux/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions