Add visual feedback to your Expo web app.
Pinthread selects browser DOM elements. Expo web renders those elements; native iOS and Android views do not. Keep the widget in a web-only file.
01 · Create a project
Sign up free with Google and create a project in the dashboard. Its Install tab shows the tag with your project key filled in. The Free plan costs $0 a month.
No Expo web app yet? Start one:
npx create-expo-app@latest my-app02 · Add the script tag
App.web.jsx
import { useEffect } from "react";
export default function App() {
useEffect(() => {
const script = document.createElement("script");
script.src = "https://pinthread.dev/embed.js";
script.dataset.project = "YOUR_PROJECT_KEY";
script.defer = true;
document.body.append(script);
return () => script.remove();
}, []);
return <h1>Fixture</h1>;
}For a classic Expo app, keep your native App.jsx and add this web entry. Keep your existing web content instead of the example heading. Expo Router apps should mount once in their existing _layout.web.jsx, not in each route.
Replace YOUR_PROJECT_KEY with the key from the Install tab. The key is public: it only tells the widget which project to load.
03 · Check that it works
Install web dependencies with npx expo install react-dom react-native-web @expo/metro-runtime. Run npx expo start --web. Open the browser, pin a comment and reload to check the thread. The pinthread button shows at the edge of the page, and the project’s Install tab changes from waiting to installed. Click the button, sign in, and pin a comment to any element.
Pages on localhost and 127.0.0.1 load pinthread for every project. For a deployed site, add its address under the project’s Settings.
Troubleshooting
The CLI cannot identify the app
Run it in the folder whose package.json declares expo. The CLI prints manual web-only mount steps rather than editing native files.
The widget does not appear on iOS or Android
Native views have no browser DOM. Pinthread does not annotate native views. Review the Expo web build instead; a native SDK is not included.
The widget does not appear on a deployed web build
Allow the deployed origin in your project settings. Export web assets with npx expo export --platform web.
Connect your coding agent
pinthread is also an MCP server. Claude Code, Cursor, or Codex can read every comment with its page and element, make the change, and reply in the thread.
Questions
Does pinthread support Expo Go or native React Native views?
No. The widget requires a browser DOM. Expo web is supported; native iOS and Android views are not.
Can I share the same component across native and web builds?
Keep the Pinthread import or script in a .web.jsx file. Do not import it from shared native components.
Other frameworks
- Next.jsnext/script in the App Router or Pages Router.
- ViteReact, Vue, or Svelte: one tag in index.html.
- AstroAn inline script in your base layout.
- SvelteKitOne tag in src/app.html.
- NuxtA head script in nuxt.config.ts.
- AngularOne tag in src/index.html.
- HTMLStatic sites, site generators, and templates.
- All install stepsAccount, project, and invitations.