> ## Documentation Index
> Fetch the complete documentation index at: https://docs.evox.wraithesports.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Test in your own evoX

> Load your T1 plugin into evoX, assign it to a key, change the code and reload, and see the logs — the full development loop and troubleshooting.

After writing your plugin, you run it **in your own evoX app** and test it on your device. This page describes the full loop and common problems.

<Warning>T1 (trusted-node) is not a sandbox; the code you load can access everything your Windows account can access. Load only your own/reviewed code.</Warning>

## Full loop

<Steps>
  <Step title="Prepare the project">
    ```bash theme={}
    npx @evoxapp/plugin-cli init my-plugin --runtime trusted-node --name "Denemem"
    cd my-plugin
    npm install
    ```

    `npm install` is **required** — if `@evoxapp/plugin-sdk` and the libraries you added (`obs-websocket-js` etc.) are not installed into `node_modules`, the plugin fails with an import error when starting.
  </Step>

  <Step title="Open the Developer window">
    In evoX, go to the **Plugins** section and click the **Developer** button in the top bar.
  </Step>

  <Step title="Select the project and grant trust">
    Select the `my-plugin` folder with **Select project**. The entry moves to the **Awaiting trust** state; read the T1 risk text and confirm trust.
  </Step>

  <Step title="Start">
    Press **Start**. The status should go **Starting → Running**. If it does not, see the troubleshooting below.
  </Step>

  <Step title="Assign the action to a key">
    On the **Keys** screen, drag your plugin's action from the action library onto a key. Press the key and rotate the knob to see the behavior.
  </Step>

  <Step title="Change → reload">
    After changing the code, **reload** in the Developer window (cycle icon, visible only while running). You don't need to close the app. If you added a new dependency, run `npm install` again first.
  </Step>

  <Step title="See the logs">
    With the entry's **log** action, see your plugin's `console.log`/`console.error` output (bounded/redacted). This is the main place for debugging.
  </Step>
</Steps>

## Status labels

| Status                    | Meaning                                                                 |
| ------------------------- | ----------------------------------------------------------------------- |
| **Awaiting trust**        | You haven't granted trust yet; confirmation is required before starting |
| **Starting**              | The process was forked, waiting for the handshake                       |
| **Running**               | The plugin is active; it receives events and can update the key         |
| **Retrying**              | It crashed and is being restarted with a limited budget (backoff)       |
| **Disabled due to error** | It crashed too many times; fix it using the logs and start again        |
| **Stopped**               | You stopped it manually or it was never started                         |

## Troubleshooting

| Symptom                                               | Likely cause and fix                                                                                                                                                       |
| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **The project cannot be selected / invalid manifest** | `manifest.json` `runtime.kind` must be **`trusted-node`** and `runtime.entry` (e.g. `runtime.mjs`) must be a real file in the folder. Symlinks/shortcuts are not accepted. |
| **"Retrying" / "Disabled due to error" on start**     | `runtime.mjs` fails while starting. **Open the logs.** The most common cause: `@evoxapp/plugin-sdk` or a library cannot be found because `npm install` was not run.        |
| **The action does not appear in the key library**     | Is the plugin **Running**? Are `manifest.json` `actions[].controllers` correct (`Keypad`/`Knob`)?                                                                          |
| **The code changed but the key does not update**      | **Reload** from the Developer window. For knob behavior, make sure the action supports `Knob`.                                                                             |
| **Handshake/startup timeout**                         | Does `runtime.mjs` call `await client.start()`? Long synchronous blocking can delay startup; set up connections lazily on `willAppear`.                                    |
| **The image does not appear**                         | The `setImage` call must contain `kind:'raster'`, a `mimeType` value of `image/png`, `image/jpeg` or `image/webp`, and valid `dataBase64` bytes.                           |

## Next step

<CardGroup cols={2}>
  <Card title="Writing an integration plugin" href="/en/sdk/build-integrations">Real OBS/Twitch/Spotify-style integration patterns.</Card>
  <Card title="Events and host-RPC reference" href="/en/sdk/events-reference">The full event and call surface.</Card>
</CardGroup>
