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

# Other Frontend Options

> No dedicated adapter needed — the same createClient() call works anywhere.

No dedicated Raykoi adapter needed for a framework outside React/Vue/Svelte/Angular — the same `createClient()` / `client.form(id).submit()` calls used in [Node.js](/integrations/nodejs) work identically inside any environment's own idiom (Solid.js, Alpine.js, jQuery, or anything else):

```javascript theme={null}
import { createClient } from '@raykoi/sdk';

const client = createClient();
const form = client.form('YOUR_PUBLIC_ID');

await form.submit({ email: 'user@example.com' });
```

Wire that call into your framework's own event handling — a signal-driven `onSubmit`, an `@submit.prevent`, a jQuery `.on('submit', ...)` — reading real field values off the event instead of a hardcoded string.

## CAPTCHA

The raw `client.form(id).submit()` call never renders or manages a CAPTCHA widget for you, in a browser or in [Node.js](/integrations/nodejs#captcha-from-node-js) — it gets no `<form>`/event reference, just a formId and a data object, so there's nothing for it to mount a widget into. That's different from the framework adapters (`useRaykoiForm` etc.) and `submit.js`, both of which fully own a widget's lifecycle.

<Tabs>
  <Tab title="Invisible mode">
    Automatic — the one thing a browser *does* give you here. A token is silently acquired and attached before every `submit()`, nothing to add:

    ```javascript theme={null}
    await form.submit({ email });
    ```
  </Tab>

  <Tab title="Checkbox mode">
    Manual. Render the provider's widget yourself, then pass the resulting token — `form.meta()` tells you which provider/site key to use:

    ```javascript theme={null}
    const { captcha } = await form.meta(); // { provider, siteKey, widgetMode: 'checkbox' }
    // ...render captcha.provider's widget with captcha.siteKey, get a token from its callback...
    await form.submit({ email }, { captchaToken });
    ```
  </Tab>
</Tabs>

Authenticating with a secret API key instead? CAPTCHA is skipped entirely regardless of widget mode.

## Preact

Preact's API is React-compatible via `preact/compat` — `@raykoi/sdk/react` works as-is, no separate adapter needed. Use the [React](/integrations/react) page.
