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-app

02 · 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