# Quickstart: collect website feedback

Create an Annot8 project, install the website feedback widget, and collect your first bug report or pinned comment.

Source: https://docs.annot8.app/docs/quickstart



You need an Annot8 account and the ability to add a script tag to your site.
[Sign up free](https://www.annot8.app/sign-up) — no card required.

<Steps>
  <Step>
    ## Create a project [#create-a-project]

    In the [dashboard](https://www.annot8.app/dashboard), click **New project** and give
    it a name. A project represents one site or app, and it comes with a project key
    that looks like `pj_...`.

    Every new project starts with a **Production** environment. Add the hosts you
    actually develop against — go to **Settings → Environments** and create a
    `Development` environment with a pattern like:

    ```
    localhost *.local 127.0.0.1
    ```

    The widget refuses to load on a hostname that doesn't match any environment, so
    this step is what makes it appear on your machine.
  </Step>

  <Step>
    ## Copy the snippet [#copy-the-snippet]

    Open **Settings → Installation**. The snippet is generated for your project and
    already contains the right project key and backend URL:

    ```html title="Paste before </body>"
    <script
      src="https://www.annot8.app/widget.js"
      data-project-id="pj_xxxxxxxxxxxx"
      data-convex-url="https://your-deployment.convex.cloud"
      data-dashboard-url="https://www.annot8.app"
      async
    ></script>
    ```

    <Callout type="warn">
      Copy the values from your own dashboard. A snippet borrowed from another
      project or another workspace will fail the origin check and load nothing.
    </Callout>

    The same Installation page has an **agent prompt** tab: a ready-made instruction
    block you can paste into Claude Code, Cursor, or any coding agent, which tells
    it to wire the tag into your framework correctly.
  </Step>

  <Step>
    ## Add it to your site [#add-it-to-your-site]

    <Tabs items="[&#x22;HTML&#x22;, &#x22;Next.js&#x22;, &#x22;React&#x22;, &#x22;Vue&#x22;, &#x22;Astro&#x22;]">
      <Tab value="HTML">
        ```html title="index.html"
        <body>
          <!-- your content -->
          <script
            src="https://www.annot8.app/widget.js"
            data-project-id="pj_xxxxxxxxxxxx"
            data-convex-url="https://your-deployment.convex.cloud"
            async
          ></script>
        </body>
        ```
      </Tab>

      <Tab value="Next.js">
        ```tsx title="app/layout.tsx"
        import Script from "next/script";

        export default function RootLayout({
          children,
        }: {
          children: React.ReactNode;
        }) {
          return (
            <html lang="en">
              <body>
                {children}
                <Script
                  src="https://www.annot8.app/widget.js"
                  data-project-id={process.env.NEXT_PUBLIC_ANNOT8_PROJECT_ID}
                  data-convex-url={process.env.NEXT_PUBLIC_ANNOT8_CONVEX_URL}
                  strategy="afterInteractive"
                />
              </body>
            </html>
          );
        }
        ```
      </Tab>

      <Tab value="React">
        ```tsx title="src/main.tsx"
        import { useEffect } from "react";

        export function Annot8() {
          useEffect(() => {
            const script = document.createElement("script");
            script.src = "https://www.annot8.app/widget.js";
            script.dataset.projectId = "pj_xxxxxxxxxxxx";
            script.dataset.convexUrl = "https://your-deployment.convex.cloud";
            script.async = true;
            document.body.appendChild(script);
            return () => script.remove();
          }, []);

          return null;
        }
        ```

        Render `<Annot8 />` once, from your root component — not from a route.
      </Tab>

      <Tab value="Vue">
        ```vue title="App.vue"
        <script setup lang="ts">
        import { onMounted } from "vue";

        onMounted(() => {
          const script = document.createElement("script");
          script.src = "https://www.annot8.app/widget.js";
          script.dataset.projectId = "pj_xxxxxxxxxxxx";
          script.dataset.convexUrl = "https://your-deployment.convex.cloud";
          script.async = true;
          document.body.appendChild(script);
        });
        </script>
        ```
      </Tab>

      <Tab value="Astro">
        ```astro title="src/layouts/Base.astro"
        <body>
          <slot />
          <script
            is:inline
            src="https://www.annot8.app/widget.js"
            data-project-id="pj_xxxxxxxxxxxx"
            data-convex-url="https://your-deployment.convex.cloud"
            async
          ></script>
        </body>
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step>
    ## Leave a comment [#leave-a-comment]

    Reload the page. A launcher appears in the corner.

    1. Open it and choose **Annotate this page**.
    2. Click the element you want to talk about.
    3. Type your feedback and submit.

    The thread shows up in **Project → Inbox** immediately, with a screenshot, the
    element's selector, the page URL, the viewport, and any console or network
    errors from the session.
  </Step>
</Steps>

## A note on production [#a-note-on-production]

By default the annotation widget is **hidden on production hosts** so real
visitors never see it. Your team still sees it everywhere else.

When you're ready to collect feedback from live traffic, turn on **Show widget
in production** in **Settings → Features**.

## Next [#next]

<Cards>
  <Card title="How Annot8 is organised" href="/docs/concepts">
    Workspaces, projects, environments, threads.
  </Card>

  <Card title="Invite your team" href="/docs/dashboard/team-members">
    Roles, invitations, and who can do what.
  </Card>

  <Card title="Send threads to Slack or Linear" href="/docs/integrations/overview">
    Connect the tools you already use.
  </Card>

  <Card title="Widget not appearing?" href="/docs/troubleshooting">
    The usual causes, in order.
  </Card>
</Cards>
