Documentation

Note8 Docs

Everything you need to integrate visual feedback into your app — from a single script tag to a full React setup, plus the dashboard, REST API, MCP server, and AI agent daemon.

Getting Started

Note8 is a visual feedback widget for web applications. Your users can screenshot, annotate, and point at elements on your page. Then your team (or AI agents) triages and resolves the feedback.

Here's how it works:

  1. Install the widget: one script tag or a React provider wrapping your app.
  2. Users give feedback: they click the widget button, screenshot or point at an element, add a comment, and submit.
  3. Feedback lands in the dashboard, complete with screenshot, annotations, page URL, viewport size, and user-provided metadata.
  4. Triage with AI: use the MCP server to let Claude Code or Cursor read, triage, and resolve feedback from your editor.

Quick Start

The fastest way to get started is a single script tag. Add this to any HTML page and the feedback widget appears immediately:

index.html
<!-- Add before </body> -->
<script
  src="https://cdn.note8.dev/v1/widget.iife.js"
  data-project-key="pk_live_your_key_here"
></script>

That's it. A floating button appears in the bottom-right corner. Users can click it to open the feedback toolbar, take a screenshot, annotate it with drawing tools, add a comment, and submit. The feedback (annotated screenshot, page URL, viewport dimensions, user agent) gets sent to your dashboard.

Get your project key from the Note8 dashboard. Create an organization, then a project, and you'll see your live and test API keys.

Script Tag

The script tag is the simplest integration method. It loads the widget IIFE from the CDN and auto-initializes with data-* attributes.

CDN URL & Versioning

The CDN URL supports flexible version pinning. Choose the level of stability you need:

URL PatternResolves ToCache
cdn.note8.dev/v1/widget.iife.jsLatest v1.x.x60 seconds
cdn.note8.dev/v1.2/widget.iife.jsLatest v1.2.x1 day
cdn.note8.dev/v1.2.3/widget.iife.jsExact v1.2.31 year (immutable)
cdn.note8.dev/latest/widget.iife.jsCurrent latest60 seconds

Data Attributes

AttributeTypeDefaultDescription
data-project-keystringRequired. Your project API key (pk_live_xxx or pk_test_xxx)
data-theme'light' | 'dark' | 'auto''auto'Widget color scheme
data-position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'Floating button position
data-primary-colorhex color'#1a1818'Widget accent color
data-show-branding'true' | 'false''true'Show Note8 branding in widget
data-api-endpointURL'https://app.note8.dev/api/v1'Custom API endpoint for self-hosted
data-teamUUIDAuto-assign feedback to this team
data-memberUUIDAuto-assign feedback to this user

Full Example

index.html
<script
  src="https://cdn.note8.dev/v1/widget.iife.js"
  data-project-key="pk_live_abc123..."
  data-theme="dark"
  data-position="bottom-left"
  data-primary-color="#ff4048"
  data-show-branding="false"
></script>

React SDK

For React apps, install the @note8/react package for component-level control over the widget.

Installation

terminal
npm install @note8/react @note8/sdk html2canvas

FeedbackProvider

Wrap your app (or a subtree) with FeedbackProvider. It initializes the widget and provides context to child components.

app.tsx
import { FeedbackProvider } from "@note8/react";

export default function App({ children }) {
  return (
    <FeedbackProvider
      projectKey="pk_live_abc123..."
      theme="auto"
      position="bottom-right"
      user={{ id: userId, email, name }}
    >
      {children}
    </FeedbackProvider>
  );
}

FeedbackProvider Props

PropTypeDefaultDescription
projectKeystringRequired. Your project API key
enabledbooleantrueEnable/disable the widget
theme'light' | 'dark' | 'auto''auto'Color scheme
position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'Button position
primaryColorstring'#1a1818'Widget accent color
showBrandingbooleantrueShow Note8 branding
user{ id?, email?, name? }Identify the user submitting feedback
metadataRecord<string, unknown>Custom data attached to every submission
assignTeamstring (UUID)Auto-assign to this team
assignMemberstring (UUID)Auto-assign to this user
onOpen() => voidCalled when widget opens
onClose() => voidCalled when widget closes
onSubmit(feedback) => voidCalled after successful submission
onError(error) => voidCalled on submission error

useFeedback Hook

Use useFeedback for direct widget control without the provider pattern. It returns open(), close(), and isReady.

feedback-button.tsx
import { useFeedback } from "@note8/react";

function FeedbackButton() {
  const { open, isReady } = useFeedback({
    projectKey: "pk_live_abc123...",
  });

  return (
    <button onClick={open} disabled={!isReady}>
      Send Feedback
    </button>
  );
}

useFeedbackContext

When using FeedbackProvider, access the widget controls from any child component with useFeedbackContext(). Returns the same { open, close } interface.

Configuration

The full configuration object applies to both the script tag (via data-* attributes) and the programmatic API (via Note8Widget.init()). The React SDK accepts these as props.

PropertyTypeDefaultDescription
projectKeystringRequired. pk_live_xxx or pk_test_xxx
environment'live' | 'test'Auto-detectedAuto-detected from key prefix
user{ id?, email?, name? }Identify the submitting user
metadataRecord<string, unknown>{}Custom data (max 10KB)
theme'light' | 'dark' | 'auto''auto'Widget color scheme
position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'Floating trigger button position
primaryColorstring (hex)'#1a1818'Widget accent color
showBrandingbooleantrueShow Note8 branding in widget UI
apiEndpointstring (URL)'https://app.note8.dev/api/v1'API endpoint (for self-hosted)
assignTeamstring (UUID)Auto-assign feedback to a team
assignMemberstring (UUID)Auto-assign feedback to a user
onOpen() => voidCallback when widget opens
onClose() => voidCallback when widget closes
onSubmit(feedback: FeedbackPayload) => voidCallback after successful submission
onError(error: Error) => voidCallback on submission error

Programmatic API

For full control without a framework, use the Note8Widget class directly. Available globally as window.Note8Widget when using the IIFE build, or imported from @note8/sdk.

Static Methods

MethodReturnsDescription
Note8Widget.init(config)Note8WidgetInitialize the widget with a config object. Returns the instance.
Note8Widget.getInstance()Note8Widget | nullGet the current widget instance, or null if not initialized.
Note8Widget.open()voidOpen the feedback widget.
Note8Widget.close()voidClose the widget.
Note8Widget.destroy()voidDestroy the widget and clean up all DOM elements and listeners.

Example

app.js
import { Note8Widget } from "@note8/sdk";

const widget = Note8Widget.init({
  projectKey: "pk_live_abc123...",
  theme: "dark",
  onSubmit: (feedback) => console.log(feedback),
});

// Open programmatically
widget.open();

// Clean up when done
Note8Widget.destroy();

Feedback Types

Note8 supports five feedback modes. Each one captures a different level of visual context:

annotation

Annotate

Takes a full-page screenshot and opens the drawing canvas. Users can draw, highlight, and annotate before adding a comment. Captures the screenshot, a separate annotation layer, drawing strokes, viewport dimensions, and page URL.

screenshot

Screenshot

Captures the full page or a user-selected crop region as a clean screenshot. Just the image, a comment, and full page metadata.

point

Point

Opens an overlay so users can click on a specific element. Records the exact X/Y coordinates of the click along with a screenshot. Great for pinpointing UI issues.

voice

Voice

Record a voice note describing the issue. The audio is attached to the feedback alongside any other context. Works as a standalone mode or combined with a screenshot.

general

General

Text-only feedback with no screenshot or visual context. Users type a comment and submit. Best for general suggestions or feature requests.

Drawing Tools

When users choose the annotation feedback type, they get a canvas overlay on top of the screenshot with these drawing tools:

Tools

ToolDescription
PenFreehand drawing for circling or underlining elements
HighlighterSemi-transparent broad stroke for highlighting areas
ArrowDraw arrows pointing to specific elements
RectangleDraw rectangles to frame areas of interest
EllipseDraw ellipses/circles around elements

Colors & Widths

9 colors available: red, orange, yellow, green, blue, purple, pink, black, white

4 stroke widths: 2px, 4px, 6px, 8px. All annotations support undo.

Dashboard

The Note8 dashboard is where you manage your organizations, teams, projects, and feedback.

Hierarchy

Organizations are the top-level container. Each org can have multiple teams and projects. Feedback is submitted to a project and can be assigned to a team or individual member.

Roles

LevelRolesCapabilities
Organizationowner, admin, memberOwner can delete org and manage billing. Admin can manage members and settings. Member can view and submit.
Teamlead, memberLead can manage team members. All team members can view and manage assigned feedback.

Feedback Workflow

Every feedback submission goes through a status workflow:

openin_progressresolveddismissed

You can assign feedback to team members, add resolution notes, and add comments (from users, AI agents, or the system).

REST API

The widget communicates with Note8 via two API endpoints. You can also call these directly for custom integrations.

Submit Feedback

POST /api/v1/feedback
// Request body
{
  "projectKey":        "pk_live_abc123...",
  "environment":       "live",
  "pageUrl":           "https://example.com/page",
  "feedbackType":      "annotation",
  "comment":           "Button misaligned on mobile",
  "screenshot":        "data:image/png;base64,...",
  "annotationLayer":   "data:image/png;base64,...",
  "voiceNote":         "data:audio/webm;base64,...",
  "viewportDimensions": { "width": 1440, "height": 900 }
}

The screenshot field carries the clean page capture. annotationLayer is a separate transparent PNG containing only the user's drawings — this lets AI agents distinguish annotations from page content. voiceNote is base64-encoded audio (WebM) when the user records a voice note.

Validate API Key

POST /api/v1/feedback/validate
// Request body
{ "projectKey": "pk_live_abc123..." }

// Response
{ "valid": true }

Paginated Feedback List

GET /api/v1/feedback/page?projectId=...&page=1&pageSize=20
// Response
{
  "data": [...], 
  "pagination": { "page": 1, "pageSize": 20, "total": 47, "totalPages": 3 }
}

Supports query parameters: status, feedbackType, search, page, pageSize. Requires a PAT in the Authorization: Bearer note8_xxx header.

Feedback Comments

GET /api/v1/feedback/{id}/comments
// Response
{ "data": [{ "id", "comment", "source": "user", ... }] }
POST /api/v1/feedback/{id}/comments
// Request body
{ "comment": "Fixed in v2.1.0", "source": "ai" }

Comment sources: user, ai, or system. Both endpoints require PAT authentication.

Response Format

All API responses follow a consistent shape:

// Success
{ "data": { ... } }

// Error
{ "error": { "code": "INVALID_KEY", "message": "..." } }

Authentication

The feedback submission and validation endpoints authenticate via the projectKey field in the request body. No headers required. The key identifies the project and determines whether feedback goes to the live or test environment. Dashboard API endpoints use session-based authentication or a Personal Access Token (PAT) in the Authorization: Bearer note8_xxx header.

MCP Server

The Note8 MCP server lets AI assistants (Claude Code, Cursor, etc.) read, triage, and resolve feedback directly from your editor using the Model Context Protocol.

Setup — Claude Code

.mcp.json
{
  "mcpServers": {
    "note8": {
      "command": "npx",
      "args": ["@note8/mcp-server"],
      "env": {
        "NOTE8_TOKEN": "note8_your_pat_here"
      }
    }
  }
}

Setup — Cursor

.cursor/mcp.json
{
  "mcpServers": {
    "note8": {
      "command": "npx",
      "args": ["@note8/mcp-server"],
      "env": {
        "NOTE8_TOKEN": "note8_your_pat_here"
      }
    }
  }
}

Available Tools

ToolDescription
list_organizationsList organizations you belong to
list_projectsList projects in an organization
list_teamsList teams in an organization
list_feedbackList feedback with filters (status, type, date range, pagination)
get_feedbackGet full feedback details including comments
update_feedbackUpdate status, assignment, or resolution notes
get_screenshotGet the screenshot as base64 image
get_feedback_statsGet status counts (open, in_progress, resolved, dismissed)
add_commentAdd a comment to feedback (source: user or ai)
list_commentsList all comments on a feedback item

Workflow Example

A typical AI-assisted triage workflow:

  1. list_organizations() to find your org
  2. list_projects(org_id) to pick the project
  3. list_feedback(project_id, status: "open") to see open feedback
  4. get_feedback(feedback_id) to read details + comments
  5. get_screenshot(feedback_id) to view the annotated screenshot
  6. Fix the issue in code, then: update_feedback(id, status: "resolved", resolution_notes: "...")
  7. add_comment(id, comment: "Fixed in v2.1.0")

Agent Daemon

The Note8 agent daemon is a background process that watches for new feedback and autonomously attempts fixes using your local AI coding agent. It runs on your machine, uses your tokens, and never sends your code to Note8's servers. It ships with a built-in web dashboard for configuration, project linking, and activity monitoring.

Installation

terminal
npm install -g @note8/agent

Quick Start

terminal
# Start the daemon (opens dashboard at localhost:3847)
note8-agent start

# Authenticate with your PAT
note8-agent auth note8_your_pat_here

# Link a Note8 project to a local git repo
note8-agent link <project-id> ./my-project

The daemon starts a local web server with a dashboard UI. From the dashboard you can authenticate, link projects to local directories, configure schedules, and monitor agent activity — or do it all from the CLI.

CLI Commands

CommandDescription
note8-agent startStart the daemon and open the web dashboard
note8-agent stopStop the running daemon
note8-agent statusShow daemon status, linked projects, and schedule
note8-agent auth <token>Store a PAT (note8_xxx) for API authentication
note8-agent link <id> <dir>Link a Note8 project to a local git repository
note8-agent unlink <id>Unlink a project and stop its review site
note8-agent pollTrigger an immediate feedback poll
note8-agent configPrint the current configuration as JSON
note8-agent cleanupRemove stale worktrees from completed or failed fixes
note8-agent review statusShow running review sites and their preview URLs
note8-agent review rebuildForce rebuild a review branch from merged fixes

Start Options

FlagDefaultDescription
--port, -p3847Port for the local dashboard and API server
--api-urlhttps://app.note8.devNote8 API URL (for self-hosted)
--no-openDo not auto-open the dashboard in the browser

Agent Dashboard

The daemon includes a web dashboard at http://localhost:3847 for managing everything visually:

Projects

Link Note8 projects to local git repos. See feedback counts, agent activity, and per-project settings.

Activity Feed

Real-time log of agent actions: feedback received, branches created, fixes attempted, results.

Schedule

Choose when the agent runs: 24/7, business hours, nights & weekends, or a custom cron expression.

Settings

Configure AI tool preference (Claude, Codex, Gemini), concurrency, branch strategy, daily caps, and timeouts.

Review Sites

When the daemon links a project, it can spin up a live review site: a preview deployment that merges all approved fixes into a single branch so stakeholders can see the result before anything touches production.

Live Preview

Each linked project gets a preview URL. The daemon runs your dev server in a git worktree and proxies it through a tunnel.

Fix Approval

Review individual fixes in the dashboard or VS Code extension. Approve to merge into the review branch, reject to discard.

Automatic Rebuild

When you approve or reject a fix, the review branch rebuilds automatically. The preview site reflects the latest state.

One-Click Ship

When the review branch looks good, merge it to your base branch. All approved fixes land in a single PR.

Workflow Strategies

Choose how the agent organizes its work. The default strategy is review-branch. Each fix gets its own branch, and approved fixes are merged into a shared review branch for preview. Override per-project in the dashboard or config file.

StrategyBehaviour
review-branchDefault. One branch per fix, merged into a shared review branch. Best for teams that want preview sites.
collaborativeFixes are applied to the same working branch. Useful for rapid iteration on a single feature.
isolatedEach fix stays on its own branch, never merged automatically. Best for cautious teams.
directFixes are committed directly to the base branch. Only for personal projects or brave teams.

Your Controls

You control every aspect of what the agent does, when it runs, and how aggressively it operates. Settings are configured through the agent dashboard or by editing ~/.note8/config.json directly.

Global Defaults vs Per-Project Overrides

Every setting has a global default that applies to all linked projects. Any project can override any setting. Toggle a field from “Default” to “Custom” in the project settings page and set a project-specific value. Clearing the override reverts to the global default.

Schedule

Control when the agent runs:

PresetBehaviour
24/7Polls continuously every minute
Business Hours9am–5pm weekdays in your timezone
Nights & WeekendsRuns outside business hours only
CustomYour own cron expression (e.g. */5 * * * *)

Timezone is configurable per-project, so a US team and an EU team can run on different schedules within the same daemon.

AI Coding Agent

Control which AI tools are used and how they behave:

Tool preference

Drag to reorder Claude, Codex, and Gemini. The daemon uses the first one it detects on your machine.

Concurrency

Run 1–3 agent tasks in parallel. Higher means faster throughput but more resource usage.

Timeout

Hard limit per fix attempt: 1, 3, 5, or 10 minutes. Kills runaway agents that get stuck.

Daily cap

Maximum fix attempts in a 24-hour window (1–500). Prevents unexpected API costs.

Branch strategy

"New branch" creates an isolated branch per fix. "Current branch" commits in place.

Branch template

Customize branch names. Default: note8/fb-{shortId}. Use {shortId} for the feedback ID.

Auto-commit

Automatically commit changes on the fix branch. Enabled by default.

Auto-push

Push fix branches to the remote after committing. Off by default so you review locally first.

Feedback Filters

Choose which feedback statuses the agent processes: open, in_progress, resolved, or dismissed. By default only open items are picked up. You can override this globally or per-project. For example, one project might also retry in_progress items while another only handles new ones.

Configuration Reference

Full configuration reference for ~/.note8/config.json. Every field is optional. The daemon uses sensible defaults.

SettingDefaultDescription
schedule.presetbusiness-hours'24/7', 'business-hours', 'nights-weekends', or 'custom'
schedule.cron*/5 * * * *Cron expression for polling (used when preset is 'custom')
agent.toolPreference[claude, codex, gemini]Ordered list of AI agents to try. Uses the first one detected.
agent.maxConcurrent1Max parallel fix attempts (1–3)
agent.timeoutMs300000Timeout per fix attempt in milliseconds (30s – 10min)
agent.branchStrategynew-branch'new-branch' creates an isolated branch. 'current-branch' commits in place.
agent.branchTemplatenote8/fb-{shortId}Branch naming template. {shortId} is the first 8 chars of feedback ID.
agent.autoCommittrueAutomatically commit fixes
agent.autoPushfalseAutomatically push fix branches to remote
agent.dailyCap50Maximum fix attempts per 24-hour period (1–500)

How It Works

When the daemon detects a new feedback item:

  1. Pull feedback: description, annotated screenshot, voice note, metadata, and page context
  2. Create branch: a new git branch named note8/fb-{shortId}
  3. Spawn AI agent: your configured coding agent receives the feedback as a prompt with the screenshot
  4. Agent works: reads the codebase, identifies relevant files, attempts a fix
  5. Commit & report: changes committed to the branch, status logged to the agent dashboard

Safety Guardrails

The daemon ships with built-in protections:

Git isolation

Every fix lives on its own branch. Nothing touches main or your working branch. Delete the branch to discard a bad fix.

Daily cap

Maximum fix attempts per day prevents unexpected costs. Default 50, configurable up to 500.

Timeout

Hard time limit per fix attempt prevents infinite loops. Default 5 minutes, configurable up to 10 minutes.

No code exfiltration

Your codebase never leaves your machine. Note8 only receives feedback payloads and activity status, never source code.

Auto-push disabled by default

Fixes are committed locally but not pushed. Review branches before they leave your machine.

Tool detection

The daemon detects which AI coding tools are installed on your machine and only uses what's available.

Architecture

┌────────────────────────────────────────────────────────┐
│  YOUR MACHINE                                          │
│                                                        │
│  ┌────────────┐  ┌───────────┐  ┌────────┐            │
│  │ Dashboard  │  │ Scheduler │  │ Worker │            │
│  │ :3847     │→ │ (cron)    │→ │ (agent)│            │
│  └──────┬─────┘  └───────────┘  └───┬────┘            │
│         │ SSE                        │                 │
│  ┌──────┴─────┐               ┌──────┴─────┐          │
│  │ VS Code    │               │ Your repo  │          │
│  │ Extension  │               │ (local git)│          │
│  └────────────┘               └──────┬─────┘          │
│                               ┌──────┴─────┐          │
│                               │ Review site│→ preview │
│                               │ (worktree) │   URL    │
│                               └────────────┘          │
└─────────────────────────┬──────────────────────────────┘
                          ↕ feedback + status only
                    ┌───────────────┐
                    │ Note8 servers │ ← no code, no keys
                    └───────────────┘

Self-Feedback Workflow

The daemon isn't just for client feedback. Use the Note8 widget on your own site while you develop. Circle small issues (a padding tweak, a broken hover state, a typo) and move on. The daemon picks them up and fixes them in the background while you stay focused on the big feature.

When you're done with the main work, check the agent dashboard. Your small fixes are already sitting there as branches ready to review and merge.

VS Code Extension

The Note8 VS Code extension puts the feedback workflow in your editor. Triage incoming feedback, approve or reject agent fixes, manage review sites, monitor activity. It connects to the agent daemon on your machine and streams events in real time.

Installation

Search for note8 in the VS Code Marketplace and click Install. Or install from the command line:

terminal
code --install-extension note8.note8-vscode

The extension activates on startup and attempts to connect to the agent daemon automatically. Make sure the daemon is running (note8-agent start) before opening VS Code.

Authentication

Open the Command Palette (Ctrl+Shift+P) and run note8: Authenticate. Enter your Personal Access Token. It gets stored in your OS keychain via VS Code's SecretStorage API, never in plain text.

Sidebar Views

The extension adds a Note8 icon to the Activity Bar with three views:

Feedback Queue

Incoming feedback grouped by status (awaiting approval, completed, failed). Approve, skip, retry, or undo inline.

Projects

Linked projects with review site status, preview URLs, and individual fix branches. Approve or reject fixes to update the review site.

Activity

Live event stream from the daemon. Shows feedback received, agents spawned, fixes committed, errors.

Commands

All commands are available via the Command Palette (Ctrl+Shift+P):

CommandShortcutDescription
note8: AuthenticateEnter and store your PAT
note8: ConnectConnect to the agent daemon
note8: Poll NowCtrl+Shift+NTrigger an immediate feedback poll
note8: Approve ItemApprove the selected feedback item
note8: Reject ItemReject the selected feedback item
note8: Start Review SiteStart a review site for the selected project
note8: Stop Review SiteStop the review site
note8: Open Review SiteOpen the preview URL in your browser
note8: Approve FixMerge a fix branch into the review branch
note8: Reject FixRemove a fix from the review branch
note8: Refresh AllForce refresh all sidebar views

Settings

SettingDefaultDescription
note8.daemonUrlhttp://localhost:3847URL of the agent daemon API
note8.dashboardUrlhttps://app.note8.devURL of the Note8 dashboard API
note8.autoConnecttrueAutomatically connect to the daemon on startup
note8.notifications.newFeedbacktrueShow a toast when new feedback arrives
note8.notifications.agentCompletedtrueShow a toast when an agent finishes a fix
note8.notifications.agentFailedtrueShow a toast when an agent fails

Status Bar

The extension shows a status bar item with the connection state and pending feedback count. A spinner appears while an agent is actively working on a fix. Click the status bar item to open the sidebar.

API Keys & Auth

Note8 uses three types of keys for different purposes:

Live Key

pk_live_xxxxxxxx...

Used in production. Feedback submitted with this key appears in the live environment.

Test Key

pk_test_xxxxxxxx...

Used in development. Feedback appears in the test environment, separate from production.

Personal Access Token

note8_xxxxxxxx...

Used for MCP server and API access. Created in dashboard Settings. Scoped to your user account.

Key Management

Project API keys (live and test) are generated automatically when you create a project. You can regenerate them at any time from the project settings page in the dashboard. This immediately invalidates the old key.

Personal Access Tokens (PATs) are created in the dashboard under Settings → Access Tokens. Each PAT shows a prefix (note8_ + first 8 chars) for identification. The full token is shown only once at creation time.

Limits & Constraints

ResourceLimit
Rate limit (submissions)10 per minute / 100 per hour per IP
Screenshot size5 MB max
Comment length5,000 characters
Metadata per submission10 KB
Feedback list pagination50 items per page max
Invitation expiry7 days
Organizations per userUnlimited
Teams per organizationUnlimited
Projects per organizationUnlimited
Feedback per projectUnlimited
PAT expiryConfigurable (default: never expires)