# Getting Started

Oda is the command line interface for interacting with Moreficent's services. To get started:

* Download the platform specific binaries and make them executable.&#x20;
* Obtain API keys and configure the binary


# Windows

### Download Binary

Currently, only x64 CPUs are supported. The binary can be downloaded from the following URL:

* [Oda Windows x64](https://moreficent-oda-binary.s3.ap-south-1.amazonaws.com/oda_windows.exe)

### Run Binary

* Rename the binary to `oda.exe`
* Invoke the file with the `--help` flag to check

{% tabs %}
{% tab title="Command Prompt" %}

```shell
mv oda_windows.exe oda.exe
./oda.exe --help
```

The output should be similar to:

<figure><img src="/files/2LG1q9tPqaa3gNHVRVxn" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Power Shell" %}

```powerquery
mv oda_windows.exe oda.exe
oda.exe --help
```

The output should be similar to:

<figure><img src="/files/8UjG0qWld626Tsqk7QJz" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Linux

### Download Binary

Currently x64 and arm64 CPUs are supported. The binaries can be downloaded from the from the following URLs:

* [Oda Linux x64](https://moreficent-oda-binary.s3.ap-south-1.amazonaws.com/oda_linux_x64)
* [Oda Linux arm64](https://moreficent-oda-binary.s3.ap-south-1.amazonaws.com/oda_linux_arm64)

### Run Binary

* Rename the binary to `oda`
* Make the file executable
* Invoke the file with the `--help` flag to check

```shell-session
mv oda_linux_x64 oda
chmod +x oda
./oda --help
```

The output should be similar to:

<figure><img src="/files/7uuijKV5HL0mCw17ZhfP" alt=""><figcaption></figcaption></figure>


# MacOS

### Download Binary

Currently arm (i.e. M series) CPUs are supported. The binary can be downloaded from the following URL:

* [Oda MacOS arm](https://moreficent-oda-binary.s3.ap-south-1.amazonaws.com/oda_macos_arm)

### Run Binary

MacOS imposes a stronger security fence around unsigned binaries downloaded from the internet, therefore a few extra steps have to be followed before the program can be executed.&#x20;

The first steps are the same as they are for [Linux](/getting-started/linux):

* Rename the binary to `oda`
* Make the file executable
* Invoke the file with the `--help` flag

```shell
mv oda_macos_arm oda
chmod +x oda
./oda --help
```

This will trigger a prompt:

<figure><img src="/files/dKfRTRzlt10emLhgbfkS" alt=""><figcaption></figcaption></figure>

* Open System Preferences
* Go to Security & Privacy
* Go to the General tab
* Click Allow Anyway

<figure><img src="/files/8et2EZ98lOoIkehjU8j5" alt=""><figcaption></figcaption></figure>

* Go back to the terminal and invoke the binary with the --help flag
* The operating system will show another warning. Click on Open

<figure><img src="/files/JU8Cte79Ebigad0cmKpu" alt=""><figcaption></figcaption></figure>

MacOS will now allow the binary to be executed without throwing warnings.&#x20;

<figure><img src="/files/W5650KnM203h141r1i2y" alt=""><figcaption></figcaption></figure>


# Configuration

Most of the API calls made by the CLI require the request to have been authenticated. Configuring the binary helps avoid re-entering the credentials when making the request. This is optional, and there may be circumstances, such as in a stateless environment, where it may not be appropriate.&#x20;

Configuration is a three step process:

* Obtain the credentials from application. The option will be present in the profile popover on the top right of the window.
* Run the `*-configure` command to save the configuration
* Run the `*-cred-check` command to validate the configuration

For example, for Moreficent:

{% embed url="<https://youtu.be/rVPKQQAwuQo>" %}

For example, for Dunebox:

{% embed url="<https://youtu.be/nYKEk0C7d3M>" %}


# Command Reference

For ease of reference, the pages are sorted in lexicographic order. If you are new to the docs, you should read [dunebox-configure](/command-reference/dunebox-configure), [dunebox-cred-check](/command-reference/dunebox-cred-check) and [dunebox-status](/command-reference/dunebox-status) before the others.&#x20;

Our platform, and the CLI, are new and continually evolving. Therefore there may be times when the documentation is out of sync with the product. In these cases the final source of truth is the help that has been built into the CLI binary.

To view a list of all subcommands, call the binary with the `--help` flag. &#x20;

<figure><img src="/files/G9uII0DdTg4eJBQeiSQ3" alt=""><figcaption></figcaption></figure>

For help with a subcommand, call the subcommand with the `--help` flag

<figure><img src="/files/LmyZi93bViWwA1XbxI1F" alt=""><figcaption></figcaption></figure>


# dunebox-account-info

Returns the profile details and permission string associated with the account

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center">flag</td><td align="center">Yes</td><td>Pretty prints output. Default is JSON.</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON object with the following fields:

<table><thead><tr><th width="149" align="center">Field</th><th width="100" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>user_name</code></td><td align="center"><code>String</code></td><td>User name associated with the access key</td></tr><tr><td align="center"><code>user_uid</code></td><td align="center"><code>String</code></td><td>UID associated with the access key</td></tr><tr><td align="center"><code>perm</code></td><td align="center"><code>String</code></td><td>Permission string associated with the access key</td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<figure><img src="/files/URBRol4WbFZt6i2qVykJ" alt=""><figcaption></figcaption></figure>


# dunebox-archive

Archive user account. Requires admin permissions.

### Arguments

<table><thead><tr><th width="178">Argument</th><th width="100" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Pass the empty string to unset.</td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Pass the empty string to unset.</td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Pass the empty string to unset.</td></tr><tr><td><code>--user-id</code></td><td align="center"><code>int32</code></td><td align="center">No</td><td>User ID of the account to archive</td></tr></tbody></table>

### Successful Output

None


# dunebox-autoconnect

Starts a listener to automatically connect Dunebox AVDs to local ADB

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr></tbody></table>

### Successful Output

The program will run till terminated, or the CLI window is closed, and print status messages to the console.&#x20;

{% embed url="<https://youtu.be/vr8LgjdGAQk>" %}


# dunebox-avd-build-cfg

List available build configurations

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th width="373">Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty print output</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON object with the following fields

<table><thead><tr><th width="165" align="center">Field</th><th width="212" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>device_defn</code></td><td align="center"><code>Array&#x3C;DeviceDefn></code></td><td>Available device definitions, which are virtual abstractions of the real devices, like the Google Pixel 5</td></tr><tr><td align="center"><code>avd_base</code></td><td align="center"><code>Array&#x3C;AvdBase></code></td><td>Available AVD base images</td></tr></tbody></table>

Each `DeviceDefn` has the following fields:&#x20;

<table><thead><tr><th width="149" align="center">Field</th><th width="186" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>id</code></td><td align="center"><code>String</code></td><td>UID of the device definition</td></tr><tr><td align="center"><code>name</code></td><td align="center"><code>String</code></td><td>Name of the Device</td></tr><tr><td align="center"><code>oem</code></td><td align="center"><code>String</code></td><td>OEM of the Device</td></tr></tbody></table>

Each `AvdBase` has the following fields:&#x20;

<table><thead><tr><th width="149" align="center">Field</th><th width="186" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>api</code></td><td align="center"><code>uint8</code></td><td>API level of the AVD</td></tr><tr><td align="center"><code>tag</code></td><td align="center"><code>String</code></td><td>Tag of the base image (e.g. <code>google_apis)</code></td></tr><tr><td align="center"><code>abi</code></td><td align="center"><code>String</code></td><td>Application Binary Interface of the AVD (e.g. <code>x86_64</code>)</td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<div><figure><img src="/files/mPjnjpQFGSVmwzDKw5Df" alt=""><figcaption></figcaption></figure> <figure><img src="/files/LOE6EObyFnAzqsooL5Y1" alt=""><figcaption></figcaption></figure></div>


# dunebox-avd-create

Create a Dunebox AVD

### Arguments

<table><thead><tr><th width="186">Argument</th><th width="99" align="center">Type</th><th width="110" align="center">Optional</th><th width="373">Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--avd-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the AVD. Should not clash with existing name.</td></tr><tr><td><code>--device-defn</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Device definition UID. </td></tr><tr><td><code>--api</code></td><td align="center"><code>uint8</code></td><td align="center">No</td><td>API level of the AVD</td></tr><tr><td><code>--tag</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Tag of the base image</td></tr><tr><td><code>--abi</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Application Binary Interface of the base image</td></tr></tbody></table>

We strongly suggest running [`dunebox-avd-build-cfg`](/command-reference/dunebox-avd-build-cfg) to get the available values for `device-defn`, `api`, `tag` and `abi` before running this command. Additionally, we strongly suggest using the `x86_64 abi` whenever possible.

### Successful Output

None


# dunebox-avd-delete

Delete an AVD

### Arguments

###

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr></tbody></table>

### Successful Output

None


# dunebox-avd-list-refresh

Force refresh of user AVDs

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th width="373">Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty print output</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON array in which each entry is an object with the following fields:

<table><thead><tr><th width="208" align="center">Field</th><th width="196" align="center">Type</th><th>Intepretation</th></tr></thead><tbody><tr><td align="center"><code>uid</code></td><td align="center"><code>String</code></td><td>UID of the configured AVD</td></tr><tr><td align="center"><code>name</code></td><td align="center"><code>String</code></td><td>Name of the configured AVD</td></tr><tr><td align="center"><code>api</code></td><td align="center"><code>uint8</code></td><td>API level of the configured AVD</td></tr><tr><td align="center"><code>device</code></td><td align="center"><code>String</code></td><td>Device of configured AVD</td></tr><tr><td align="center"><code>tag</code></td><td align="center">S<code>tring</code></td><td>AVD Base image tag (e.g. <code>google_apis</code>)</td></tr><tr><td align="center"><code>abi</code></td><td align="center"><code>String</code></td><td>Application Binary Interface of the AVD (e.g. <code>x86_64</code>)</td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<figure><img src="/files/Jax2GAUaxvjBTdhGiL2h" alt=""><figcaption></figcaption></figure>


# dunebox-configure

Configures Dunebox CLI

### Arguments

<table><thead><tr><th width="178">Argument</th><th width="100" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Pass the empty string to unset.</td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Pass the empty string to unset.s</td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Pass the empty string to unset.</td></tr><tr><td><code>--port-lb</code></td><td align="center"><code>uint16</code></td><td align="center">Yes</td><td>Lower bound of the range of ports on local device to connect the Dunebox AVD. Defaults to 12007. Pass 0 to unset.</td></tr><tr><td><code>--port-ub</code></td><td align="center"><code>uint16</code></td><td align="center">Yes</td><td>Upper bound of range of ports on local device to connect the Dunebox AVD. Defaults to 12983. Pass 0 to unset.</td></tr><tr><td><code>--adb-path</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td> Path to the adb binary. Defaults to the default value for the OS (e.g. ~/Android/Sdk/platform-tools/adb on Linux). Pass the empty string to unset.</td></tr></tbody></table>

### Successful Output

None


# dunebox-connect

Connect a Dunebox AVD to local ADB

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--port</code></td><td align="center"><code>uint16</code></td><td align="center">Yes</td><td>Local port for proxy connection. If absent, a random port from the configured range is chosen.</td></tr><tr><td><code>--token</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Connection token for the session</td></tr><tr><td><code>--asid</code></td><td align="center"><code>uint32</code></td><td align="center">Yes</td><td>Auto Session ID of the session to which the connection is to be made</td></tr></tbody></table>

Both `--token` and `--asid` can be skipped iff there is only one running emulator. Otherwise exactly one of the flags needs to be specified.&#x20;

### Successful Output

The progress of the connection will be printed to the console. The program will return once the connection breaks, which may be because the remote session terminated, local adb disconnected or the internet is disconnected.&#x20;


# dunebox-cred-check

Check whether the configured or passed Dunebox credentials are valid

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="103" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr></tbody></table>

### Successful Output

None


# dunebox-image-create

Create AVD Image

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="103" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--avd-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the AVD.</td></tr><tr><td><code>--image-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the generated image</td></tr></tbody></table>

### Successful Output

None


# dunebox-image-delete

Delete AVD image

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="103" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--image-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the image to delete.</td></tr></tbody></table>

### Successful Output

None


# dunebox-image-extract

Extract AVD Image

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="103" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--image-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the image to extract.</td></tr><tr><td><code>--avd-name</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>Name of the extracted AVD</td></tr></tbody></table>

### Successful Output

None


# dunebox-image-list

List generated AVD Images

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty print output</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON array in which each entry is an object with the following fields:

<table><thead><tr><th width="149" align="center">Field</th><th width="186" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>name</code></td><td align="center"><code>String</code></td><td>Name of the image</td></tr><tr><td align="center"><code>created</code></td><td align="center"><code>Option&#x3C;String></code></td><td>Date of creation of the image</td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<figure><img src="/files/VKakG27hjGWZ5oLkAwkd" alt=""><figcaption></figcaption></figure>


# dunebox-init

Start a Dunebox AVD

### Arguments

<table><thead><tr><th width="235">Argument</th><th width="119" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--avd</code></td><td align="center"><code>String</code></td><td align="center">No</td><td>UID of the AVD to launch</td></tr><tr><td><code>--app</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>UID of the APK to launch with the AVD</td></tr><tr><td><code>--no-launch</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Suppresses opening of the browser window. Equivalent to <em>headless mode</em>.</td></tr><tr><td><code>--await-online</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Block return till AVD is online</td></tr><tr><td><code>--cold</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Force cold boot</td></tr><tr><td><code>--throttle-factor</code></td><td align="center"><code>float32</code></td><td align="center">Yes</td><td>Initial throttle factor, should be between 1.0 and 50.0.  Higher throttle factor is equivalent to a lower frame rate.</td></tr><tr><td><code>--no-cache</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Disable cache partition</td></tr><tr><td><code>--no-snapshot-save</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Disable saving snapshot on termination</td></tr></tbody></table>

### Successful Output

If the *--no-launch* flag is passed, the result is a JSON with the following fields:

<table><thead><tr><th width="210" align="center">Field</th><th width="100" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>url</code></td><td align="center"><code>String</code></td><td>URL of the dunebox UID</td></tr><tr><td align="center"><code>auto_session_id</code></td><td align="center"><code>u32</code></td><td>Auto Session ID (asid) for the session</td></tr></tbody></table>

If it is not, there is no output from the CLI. The launched browser window may emit some messages to the console.&#x20;


# dunebox-port-map

Return a map of dunebox connections to their connection tags

### Arguments

<table><thead><tr><th width="175">Argument</th><th align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty prints output. Default is JSON.</td></tr></tbody></table>

### Successful Output

When called without the --pretty flag, the result is a JSON array in which each entry is an object with the following fields:

<table><thead><tr><th width="208" align="center">Field</th><th width="113" align="center">Type</th><th>Intepretation</th></tr></thead><tbody><tr><td align="center"><code>port</code></td><td align="center"><code>uint16</code></td><td>Local port for proxy connection. </td></tr><tr><td align="center"><code>tag</code></td><td align="center"><code>String</code></td><td>Connection parameter, depending on how the connection was made. Can be the <code>asid</code> (if it was specified with <code>dunebox-connect</code> or if the connection was made with <code>dunebox-autoconnect</code>), <code>token</code> (if it was specified with <code>dunebox-connect</code>) or default (if nothing was specified during <code>dunebox-connect</code>)</td></tr><tr><td align="center"><code>status</code></td><td align="center"><code>String</code></td><td>One of <code>online</code>, <code>offline</code> or <code>unauthorized,</code> depending on the connection status.</td></tr></tbody></table>


# dunebox-status

Gets the status of running and permitted AVDs

### Arguments

<table><thead><tr><th width="175">Argument</th><th align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty prints output. Default is JSON.</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON array in which each entry is an object with the following fields:

<table><thead><tr><th width="208" align="center">Field</th><th width="113" align="center">Type</th><th>Intepretation</th></tr></thead><tbody><tr><td align="center"><code>uid</code></td><td align="center"><code>String</code></td><td>UID of the configured AVD</td></tr><tr><td align="center"><code>name</code></td><td align="center"><code>String</code></td><td>Name of the configured AVD</td></tr><tr><td align="center"><code>api</code></td><td align="center"><code>uint8</code></td><td>API level of the configured AVD</td></tr><tr><td align="center"><code>device</code></td><td align="center"><code>String</code></td><td>Device of configured AVD</td></tr><tr><td align="center"><code>tag</code></td><td align="center">S<code>tring</code></td><td>AVD Base image tag (e.g. <code>google_apis</code>)</td></tr><tr><td align="center"><code>abi</code></td><td align="center"><code>String</code></td><td>Application Binary Interface of the AVD (e.g. <code>x86_64</code>)</td></tr><tr><td align="center"><code>permitted</code></td><td align="center"><code>bool</code></td><td>Whether the AVD can be launched</td></tr><tr><td align="center"><code>started</code></td><td align="center"><code>bool</code></td><td>Whether the AVD has been started</td></tr><tr><td align="center"><code>running</code></td><td align="center"><code>bool</code></td><td>Whether the AVD is running</td></tr><tr><td align="center"><code>auto_session_id</code></td><td align="center"><code>uint32</code></td><td>Auto Session ID (<code>asid</code>) of the AVD. The field is absent if the AVD is not running. </td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<figure><img src="/files/g80PKuhO5d7nc5wHIqlG" alt=""><figcaption></figcaption></figure>


# dunebox-terminate

Terminate a Dunebox AVD

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--asid</code></td><td align="center"><code>uint32</code></td><td align="center">Yes*</td><td>Auto Session ID of the session to terminate.</td></tr></tbody></table>

`--asid` can be skipped iff there is only one running session. Otherwise it must be specified.

### Successful Output

None


# dunebox-throttle

Throttle the forwarding UI of the Dunebox AVD. This helps with slow client machines and/or networks

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="120" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Dunebox server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--asid</code></td><td align="center"><code>uint32</code></td><td align="center">Yes*</td><td>Auto Session ID of the session to throttle.</td></tr><tr><td><code>--factor</code></td><td align="center"><code>float32</code></td><td align="center">No</td><td>Throttle factor, should be between 1.0 and 50.0.  Higher throttle factor is equivalent to a lower frame rate.</td></tr></tbody></table>

`--asid` can be skipped iff there is only one running session. Otherwise it must be specified.

### Successful Output

None


# moreficent-account-info

Returns profile details and permission string associated with the account

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="99" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center">flag</td><td align="center">Yes</td><td>Pretty prints output. Default is JSON.</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON object with the following fields:

<table><thead><tr><th width="167" align="center">Field</th><th width="100" align="center">Type</th><th>Interpretation</th></tr></thead><tbody><tr><td align="center"><code>user_name</code></td><td align="center"><code>String</code></td><td>User name associated with the access key</td></tr><tr><td align="center"><code>user_uid</code></td><td align="center"><code>String</code></td><td>UID associated with the access key</td></tr><tr><td align="center"><code>perm</code></td><td align="center"><code>String</code></td><td>Permission string associated with the access key</td></tr><tr><td align="center"><code>disk_x86</code></td><td align="center"><code>bool</code></td><td>Whether an x86 disk is associated with the account</td></tr><tr><td align="center"><code>disk_arm64</code></td><td align="center"><code>bool</code></td><td>Whether an arm64 disk is associated with the account</td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;


# moreficent-archive

Archive user account. Requires admin permissions.

### Arguments

<table><thead><tr><th width="178">Argument</th><th width="100" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Pass the empty string to unset.</td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Pass the empty string to unset.</td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Pass the empty string to unset.</td></tr><tr><td><code>--user-id</code></td><td align="center"><code>int32</code></td><td align="center">No</td><td>User ID of the account to archive</td></tr></tbody></table>

### Successful Output

None


# moreficent-configure

Configure Moreficent CLI

### Arguments

<table><thead><tr><th width="178">Argument</th><th width="100" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Pass the empty string to unset.</td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Pass the empty string to unset.</td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Pass the empty string to unset.</td></tr><tr><td><code>--adb-path</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td> Path to the adb binary. Defaults to the default value for the OS (e.g. ~/Android/Sdk/platform-tools/adb on Linux). Pass the empty string to unset.</td></tr></tbody></table>

### Successful Output

None


# moreficent-connect

Connect local android device to Moreficent instance

### Arguments

<table><thead><tr><th width="178">Argument</th><th width="100" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Pass the empty string to unset.</td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Pass the empty string to unset.</td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Pass the empty string to unset.</td></tr><tr><td><code>--token</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Share token for the session</td></tr><tr><td><code>--asid</code></td><td align="center"><code>uint32</code></td><td align="center">Yes</td><td>Auto Session ID of the session to which the connection is to be made</td></tr></tbody></table>

Both `--token` and `--asid` can be skipped iff there is only one running session. Otherwise exactly one of the flags needs to be specified.&#x20;

### Successful Output

The progress of the connection will be printed to the console. The program will return once the connection breaks, which may be because the remote session terminated, remote adb disconnected, local device is disconnected or the internet is disconnected.


# moreficent-cred-check

Checks whether the configured or passed Moreficent credentials are valid

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="103" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr></tbody></table>

### Successful Output

None


# moreficent-status

Gets the status of running and permitted environments

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="101" align="center">Type</th><th width="104" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--pretty</code></td><td align="center"><code>flag</code></td><td align="center">Yes</td><td>Pretty prints output. Default is JSON.</td></tr></tbody></table>

### Successful Output

When called without the `--pretty` flag, the result is a JSON array in which each entry is an object with the following fields:

<table><thead><tr><th width="208" align="center">Field</th><th width="113" align="center">Type</th><th>Intepretation</th></tr></thead><tbody><tr><td align="center"><code>uid</code></td><td align="center"><code>String</code></td><td>UID of the configured Environment</td></tr><tr><td align="center"><code>name</code></td><td align="center"><code>String</code></td><td>Name of the configured Environment</td></tr><tr><td align="center"><code>is_x86</code></td><td align="center"><code>bool</code></td><td>Whether the Environment runs on an x86 machine</td></tr><tr><td align="center"><code>gui</code></td><td align="center"><code>String</code></td><td>The configured graphical application of the environment</td></tr><tr><td align="center"><code>toolchain</code></td><td align="center"><code>String</code></td><td>Supported toolchain(s) in the environment</td></tr><tr><td align="center"><code>permitted</code></td><td align="center"><code>bool</code></td><td>Whether the Environment can be launched</td></tr><tr><td align="center"><code>started</code></td><td align="center"><code>bool</code></td><td>Whether the Environment has been started</td></tr><tr><td align="center"><code>running</code></td><td align="center"><code>bool</code></td><td>Whether the Environment is running</td></tr><tr><td align="center"><code>auto_session_id</code></td><td align="center"><code>uint32</code></td><td>Auto Session ID (<code>asid</code>) of the Environment. The field is absent if the Environment is not running. </td></tr></tbody></table>

The result is pretty printed when called with the `--pretty` flag.&#x20;

<figure><img src="/files/TpeIy3h39G65fecuFa62" alt=""><figcaption></figcaption></figure>


# moreficent-throttle

Throttle the forwarding UI of the Moreficent environment. This helps with slow client machines and/or networks

### Arguments

<table><thead><tr><th width="175">Argument</th><th width="120" align="center">Type</th><th width="99" align="center">Optional</th><th>Interpretation</th></tr></thead><tbody><tr><td><code>--server</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>URL of Moreficent server. Overrides the configured value if provided. </td></tr><tr><td><code>--access-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your access key. Overrides configured value if provided. </td></tr><tr><td><code>--secret-key</code></td><td align="center"><code>String</code></td><td align="center">Yes</td><td>Your secret key. Overrides configured value if provided.</td></tr><tr><td><code>--asid</code></td><td align="center"><code>uint32</code></td><td align="center">Yes*</td><td>Auto Session ID of the session to throttle.</td></tr><tr><td><code>--factor</code></td><td align="center"><code>float32</code></td><td align="center">No</td><td>Throttle factor, should be between 1.0 and 50.0.  Higher throttle factor is equivalent to a lower frame rate.</td></tr></tbody></table>

`--asid` can be skipped iff there is only one running session. Otherwise it must be specified.

### Successful Output

None


# print-config

Prints Oda configurations

### Arguments

None

### Successful Output

Pretty printed output of the current configuration. The output should be similar to:

<figure><img src="/files/WMwbdqZBRd04X26Weqr7" alt=""><figcaption></figcaption></figure>


# Changelog

### 0.8.0

19 Aug 2023

#### Under the hood

* Update request signing

### 0.7.0

2 Mar 2023

#### API Updates

* Remove disk-shared from `moreficent-account-info`
* Add `moreficent-archive`
* Add `dunebox-archive`

### 0.6.0

24 Jan 2023

#### Bug Fixes

* Fix deserialization error in `dunebox-autoconnect`

### 0.5.1

3 Jan 2023

#### API Updates

* Add `dunebox-avd-build-cfg`
* Add `dunebox-avd-create`

### 0.5.0

29 Dec 2022

#### API Updates

* Update the data returned from `dunebox-status`
* Add `dunebox-avd-delete`
* Add `dunebox-avd-list`
* Add `dunebox-image-create`
* Add `dunebox-image-delete`
* Add `dunebox-image-extract`
* Add `dunebox-image-list`

### 0.4.2

16 Dec 2022

#### API Updates

* Allow disabling of cache partition (using the `--no-cache` flag) and disabling of snapshot save (using `--no-snapshot-save` flag) during `dunebox-init`.&#x20;

### 0.4.1

7 Dec 2022

#### Behaviour Updates

* Add auto-reconnect for `moreficent-connect`

### 0.4.0

10 Nov 2022

#### API Updates

* `asid` is optional for `dunebox-terminate`

#### Under the hood

* Standardise signatures for all requests.&#x20;
* Enforce version compatibility for all requests&#x20;


