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:
- Install the widget: one script tag or a React provider wrapping your app.
- Users give feedback: they click the widget button, screenshot or point at an element, add a comment, and submit.
- Feedback lands in the dashboard, complete with screenshot, annotations, page URL, viewport size, and user-provided metadata.
- 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:
<!-- 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 Pattern | Resolves To | Cache |
|---|---|---|
| cdn.note8.dev/v1/widget.iife.js | Latest v1.x.x | 60 seconds |
| cdn.note8.dev/v1.2/widget.iife.js | Latest v1.2.x | 1 day |
| cdn.note8.dev/v1.2.3/widget.iife.js | Exact v1.2.3 | 1 year (immutable) |
| cdn.note8.dev/latest/widget.iife.js | Current latest | 60 seconds |
Data Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
| data-project-key | string | — | Required. 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-color | hex color | '#1a1818' | Widget accent color |
| data-show-branding | 'true' | 'false' | 'true' | Show Note8 branding in widget |
| data-api-endpoint | URL | 'https://app.note8.dev/api/v1' | Custom API endpoint for self-hosted |
| data-team | UUID | — | Auto-assign feedback to this team |
| data-member | UUID | — | Auto-assign feedback to this user |
Full Example
<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
npm install @note8/react @note8/sdk html2canvasFeedbackProvider
Wrap your app (or a subtree) with FeedbackProvider. It initializes the widget and provides context to child components.
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
| Prop | Type | Default | Description |
|---|---|---|---|
| projectKey | string | — | Required. Your project API key |
| enabled | boolean | true | Enable/disable the widget |
| theme | 'light' | 'dark' | 'auto' | 'auto' | Color scheme |
| position | 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' | 'bottom-right' | Button position |
| primaryColor | string | '#1a1818' | Widget accent color |
| showBranding | boolean | true | Show Note8 branding |
| user | { id?, email?, name? } | — | Identify the user submitting feedback |
| metadata | Record<string, unknown> | — | Custom data attached to every submission |
| assignTeam | string (UUID) | — | Auto-assign to this team |
| assignMember | string (UUID) | — | Auto-assign to this user |
| onOpen | () => void | — | Called when widget opens |
| onClose | () => void | — | Called when widget closes |
| onSubmit | (feedback) => void | — | Called after successful submission |
| onError | (error) => void | — | Called on submission error |
useFeedback Hook
Use useFeedback for direct widget control without the provider pattern. It returns open(), close(), and isReady.
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.
| Property | Type | Default | Description |
|---|---|---|---|
| projectKey | string | — | Required. pk_live_xxx or pk_test_xxx |
| environment | 'live' | 'test' | Auto-detected | Auto-detected from key prefix |
| user | { id?, email?, name? } | — | Identify the submitting user |
| metadata | Record<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 |
| primaryColor | string (hex) | '#1a1818' | Widget accent color |
| showBranding | boolean | true | Show Note8 branding in widget UI |
| apiEndpoint | string (URL) | 'https://app.note8.dev/api/v1' | API endpoint (for self-hosted) |
| assignTeam | string (UUID) | — | Auto-assign feedback to a team |
| assignMember | string (UUID) | — | Auto-assign feedback to a user |
| onOpen | () => void | — | Callback when widget opens |
| onClose | () => void | — | Callback when widget closes |
| onSubmit | (feedback: FeedbackPayload) => void | — | Callback after successful submission |
| onError | (error: Error) => void | — | Callback 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
| Method | Returns | Description |
|---|---|---|
| Note8Widget.init(config) | Note8Widget | Initialize the widget with a config object. Returns the instance. |
| Note8Widget.getInstance() | Note8Widget | null | Get the current widget instance, or null if not initialized. |
| Note8Widget.open() | void | Open the feedback widget. |
| Note8Widget.close() | void | Close the widget. |
| Note8Widget.destroy() | void | Destroy the widget and clean up all DOM elements and listeners. |
Example
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:
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
Captures the full page or a user-selected crop region as a clean screenshot. Just the image, a comment, and full page metadata.
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
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
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
| Tool | Description |
|---|---|
| Pen | Freehand drawing for circling or underlining elements |
| Highlighter | Semi-transparent broad stroke for highlighting areas |
| Arrow | Draw arrows pointing to specific elements |
| Rectangle | Draw rectangles to frame areas of interest |
| Ellipse | Draw 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
| Level | Roles | Capabilities |
|---|---|---|
| Organization | owner, admin, member | Owner can delete org and manage billing. Admin can manage members and settings. Member can view and submit. |
| Team | lead, member | Lead can manage team members. All team members can view and manage assigned feedback. |
Feedback Workflow
Every feedback submission goes through a status workflow:
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
// 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
// Request body
{ "projectKey": "pk_live_abc123..." }
// Response
{ "valid": true }Paginated Feedback List
// 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
// Response
{ "data": [{ "id", "comment", "source": "user", ... }] }// 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
{
"mcpServers": {
"note8": {
"command": "npx",
"args": ["@note8/mcp-server"],
"env": {
"NOTE8_TOKEN": "note8_your_pat_here"
}
}
}
}Setup — Cursor
{
"mcpServers": {
"note8": {
"command": "npx",
"args": ["@note8/mcp-server"],
"env": {
"NOTE8_TOKEN": "note8_your_pat_here"
}
}
}
}Available Tools
| Tool | Description |
|---|---|
| list_organizations | List organizations you belong to |
| list_projects | List projects in an organization |
| list_teams | List teams in an organization |
| list_feedback | List feedback with filters (status, type, date range, pagination) |
| get_feedback | Get full feedback details including comments |
| update_feedback | Update status, assignment, or resolution notes |
| get_screenshot | Get the screenshot as base64 image |
| get_feedback_stats | Get status counts (open, in_progress, resolved, dismissed) |
| add_comment | Add a comment to feedback (source: user or ai) |
| list_comments | List all comments on a feedback item |
Workflow Example
A typical AI-assisted triage workflow:
list_organizations()to find your orglist_projects(org_id)to pick the projectlist_feedback(project_id, status: "open")to see open feedbackget_feedback(feedback_id)to read details + commentsget_screenshot(feedback_id)to view the annotated screenshot- Fix the issue in code, then:
update_feedback(id, status: "resolved", resolution_notes: "...") 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
npm install -g @note8/agentQuick Start
# 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-projectThe 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
| Command | Description |
|---|---|
| note8-agent start | Start the daemon and open the web dashboard |
| note8-agent stop | Stop the running daemon |
| note8-agent status | Show 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 poll | Trigger an immediate feedback poll |
| note8-agent config | Print the current configuration as JSON |
| note8-agent cleanup | Remove stale worktrees from completed or failed fixes |
| note8-agent review status | Show running review sites and their preview URLs |
| note8-agent review rebuild | Force rebuild a review branch from merged fixes |
Start Options
| Flag | Default | Description |
|---|---|---|
| --port, -p | 3847 | Port for the local dashboard and API server |
| --api-url | https://app.note8.dev | Note8 API URL (for self-hosted) |
| --no-open | — | Do 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.
| Strategy | Behaviour |
|---|---|
| review-branch | Default. One branch per fix, merged into a shared review branch. Best for teams that want preview sites. |
| collaborative | Fixes are applied to the same working branch. Useful for rapid iteration on a single feature. |
| isolated | Each fix stays on its own branch, never merged automatically. Best for cautious teams. |
| direct | Fixes 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:
| Preset | Behaviour |
|---|---|
| 24/7 | Polls continuously every minute |
| Business Hours | 9am–5pm weekdays in your timezone |
| Nights & Weekends | Runs outside business hours only |
| Custom | Your 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.
| Setting | Default | Description |
|---|---|---|
| schedule.preset | business-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.maxConcurrent | 1 | Max parallel fix attempts (1–3) |
| agent.timeoutMs | 300000 | Timeout per fix attempt in milliseconds (30s – 10min) |
| agent.branchStrategy | new-branch | 'new-branch' creates an isolated branch. 'current-branch' commits in place. |
| agent.branchTemplate | note8/fb-{shortId} | Branch naming template. {shortId} is the first 8 chars of feedback ID. |
| agent.autoCommit | true | Automatically commit fixes |
| agent.autoPush | false | Automatically push fix branches to remote |
| agent.dailyCap | 50 | Maximum fix attempts per 24-hour period (1–500) |
How It Works
When the daemon detects a new feedback item:
- Pull feedback: description, annotated screenshot, voice note, metadata, and page context
- Create branch: a new git branch named
note8/fb-{shortId} - Spawn AI agent: your configured coding agent receives the feedback as a prompt with the screenshot
- Agent works: reads the codebase, identifies relevant files, attempts a fix
- 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:
code --install-extension note8.note8-vscodeThe 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):
| Command | Shortcut | Description |
|---|---|---|
| note8: Authenticate | — | Enter and store your PAT |
| note8: Connect | — | Connect to the agent daemon |
| note8: Poll Now | Ctrl+Shift+N | Trigger an immediate feedback poll |
| note8: Approve Item | — | Approve the selected feedback item |
| note8: Reject Item | — | Reject the selected feedback item |
| note8: Start Review Site | — | Start a review site for the selected project |
| note8: Stop Review Site | — | Stop the review site |
| note8: Open Review Site | — | Open the preview URL in your browser |
| note8: Approve Fix | — | Merge a fix branch into the review branch |
| note8: Reject Fix | — | Remove a fix from the review branch |
| note8: Refresh All | — | Force refresh all sidebar views |
Settings
| Setting | Default | Description |
|---|---|---|
| note8.daemonUrl | http://localhost:3847 | URL of the agent daemon API |
| note8.dashboardUrl | https://app.note8.dev | URL of the Note8 dashboard API |
| note8.autoConnect | true | Automatically connect to the daemon on startup |
| note8.notifications.newFeedback | true | Show a toast when new feedback arrives |
| note8.notifications.agentCompleted | true | Show a toast when an agent finishes a fix |
| note8.notifications.agentFailed | true | Show 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
| Resource | Limit |
|---|---|
| Rate limit (submissions) | 10 per minute / 100 per hour per IP |
| Screenshot size | 5 MB max |
| Comment length | 5,000 characters |
| Metadata per submission | 10 KB |
| Feedback list pagination | 50 items per page max |
| Invitation expiry | 7 days |
| Organizations per user | Unlimited |
| Teams per organization | Unlimited |
| Projects per organization | Unlimited |
| Feedback per project | Unlimited |
| PAT expiry | Configurable (default: never expires) |