connect() gets into your app, and whether you get component identity on top.
Where each framework stands
We separate “we tested this” from “this should work”. Four frameworks have an example app and a CI gate. The rest are wired and documented but nothing proves they still work.init detects the UI library separately from the framework. That distinction exists because detection used to stop at “vite is in package.json”, which installed the React adapter into Vue and Preact apps and reported all green with nothing attached.
React on Vite
The shortest path, and the one with the most in it.connect() and stamps source locations, which is what turns a DOM node into src/components/Login.tsx:81.
Next.js
Keeps SWC. No Babel migration.@reticlehq/next is CommonJS on purpose. next.config.js is loaded by Node before any ESM
transform, so an ESM-only helper fails at the least helpful moment.Remix and Astro
Both run on Vite, so both use the Vite plugin exactly as React does. Astro needs the React integration if you want component identity in.jsx islands. Static .astro markup gets DOM, network and routing without it.
SvelteKit
SvelteKit renders throughapp.html and never triggers Vite’s index.html injection, so the plugin cannot auto-connect. A client hook is the reliable path, and it is what init writes.
data-reticle-source into .svelte components, so verdicts carry file:line.
For state, use the svelteStore adapter. See State management.
Nuxt
Nuxt owns its own Vite instance and renders its own HTML. There is novite.config to patch and no index.html to inject into. The idiom is a dev-only client plugin.
The .client suffix is load-bearing
The .client suffix is load-bearing
It is what keeps the plugin out of the server bundle. Without it you are running the SDK during
SSR, where
window does not exist.Guard on import.meta.dev, never on hostname
Guard on import.meta.dev, never on hostname
window.location.hostname === 'localhost' fails twice over here. window does not exist in
SSR, and the check is false on any hosts-file alias or LAN address. import.meta.dev resolves
at build time and does not care what host you develop on.Restart the dev server
Restart the dev server
A running dev server does not pick up a new plugin. It will not appear in
.nuxt/plugins/client.mjs, and the app comes up with no SDK at all and no error saying so.@reticlehq/browser, the framework-neutral sensor. You get DOM, network, console, routing and source file:line. What you do not get is React component identity, which is the only thing the React adapter adds.
Vue
Vue apps outside Nuxt are Vite apps, soinit finds them. Install the sensor rather than the React kit.
Preact
Detected as its own UI library, because a Preact app usingpreact/compat aliases React and would otherwise be handed the React kit with nothing to attach to.
The sensor works. If you use preact/compat, the React adapter can attach through the alias, but that path is not gated.
Create React App and plain bundlers
No config file to patch, soconnect() goes in your entry module.
Plain HTML
NODE_ENV=production, but a second lock on a door leading to your users is a reasonable number.
Desktop is a different shape
Electron and Tauri invert the direction: your app dials the daemon, and there is no URL for an agent to open. Reticle also reaches the main-process and Rust IPC boundary, which the renderer cannot see.Desktop apps
Electron and Tauri, IPC observation, and the CSP trap whose failure is completely silent.
Not supported
Angular and Solid appear in dependency detection but have no wiring, no adapter and no gate. The sensor may work if you callconnect() yourself. Nothing proves it, so we are not going to list them as supported.
Something missing?
A framework you need is a
gap report. It is the signal that decides what gets built.