Every docs page renders a feedback block under the "Last updated" line:
Collapsed state — the prompt (default "Was this page helpful?") plus Yes / No thumbs.
Expanded state (after picking a thumb) — a radio list of reasons, an optional comment field for "Something else", and Cancel / Submit feedback buttons.
Submitted state — a single line of confirmation: "Thanks for your feedback".
Submissions land in two places:
page_feedbacktable — the triage backlog (rating, reason, comment, status).page_eventstable — afeedback_up/feedback_downevent so the Analytics dashboard totals stay consistent without joins.
Triage dashboard
Dashboard → your project → sidebar → Feedback
The Feedback page renders the full page_feedback backlog (up to 200 rows per request) with a status tab filter (Open / Resolved / Dismissed / All), a rating dropdown (All / Thumbs up / Thumbs down), and counts. Each row shows:
Rating icon, status pill, timestamp, page path.
Reason key (when selected) + free-text comment (when provided).
Linked issue URL (when GitHub auto-issue created one).
Row actions:
Resolve — marks the feedback done, stamps
resolved_at, hides from Open.Dismiss — marks as noise, hides from Open.
Reopen — reopens a resolved / dismissed row and clears
resolved_at.
Transitions hit PATCH /api/v1/projects/:projectId/feedback/:feedbackId with the new status.
Bots (GPTBot, ClaudeBot, PerplexityBot, Googlebot, Bingbot, generic crawlers) are dropped silently — thumbs from a scraper isn't signal.
Configure from the dashboard
Dashboard → your project → Editor → Configurations → AI & Advanced → Feedback widget
The panel has four controls:
Enable — toggle the widget on or off for this tenant.
Prompt — override the default "Was this page helpful?" text. Leave empty for the default.
Auto-open GitHub issue on negative feedback — when on, a thumbs-down with a comment opens an issue on the connected managed repo. Requires the project to have a PAT / GitHub App installation linked.
Issue labels — comma-separated labels applied to auto-opened issues. Default:
docs-feedback.
Reason options (the radio lists shown after Yes / No) are still customizable, but currently only by hand-editing nookdocs.config.json#feedback.positiveReasons and negativeReasons. See below.
Config reference
feedback.enabledbooleandefault: trueToggle the widget per tenant. When false, no "Was this helpful?" block renders.
feedback.promptstringOverride the top prompt. Default: "Was this page helpful?".
feedback.positiveReasonsArray<{id, label}>Radio options shown after Yes. Each entry has a stable id (written to page_feedback.reason, so don't rename these once you ship) and a display label.
feedback.negativeReasonsArray<{id, label}>Radio options shown after No. Use this to surface your team's own improvement themes.
feedback.github.autoIssuebooleandefault: falseOpen a GitHub issue when a thumbs-down submission carries a non-empty comment. Requires a connected managed repo.
feedback.github.labelsstring[]default: ["docs-feedback"]Labels attached to auto-opened issues.
Defaults
When feedback.positiveReasons / negativeReasons are omitted, the widget uses these:
Yes — Glad it landed. What worked?
Solved what I opened it for
Examples matched my actual use case
Easy to scan and skim
Depth and tone felt right
Something else
No — Got it. What would have helped?
Needs a runnable code sample
Missing context I had to guess at
Too much jargon for my level
Feels out of date with the product
Something else
Picking Something else reveals a free-text comment field (2000 char cap).
Example — custom reasons
{
"feedback": {
"enabled": true,
"prompt": "Was this guide clear?",
"positiveReasons": [
{ "id": "clear-example", "label": "The example matched my use case" },
{ "id": "complete", "label": "All the information was there" },
{ "id": "something-else", "label": "Something else" }
],
"negativeReasons": [
{ "id": "missing-example", "label": "Needs a code example for my language" },
{ "id": "outdated", "label": "Content is outdated" },
{ "id": "hard-to-find", "label": "I couldn't find what I was looking for" },
{ "id": "something-else", "label": "Something else" }
],
"github": {
"autoIssue": true,
"labels": ["docs-feedback", "triage"]
}
}
}API
POST /api/v1/projects/:projectId/feedback — public ingestion.
{
"path": "/guides/auth",
"rating": "up",
"reason": "easy-to-find",
"comment": "Great explanation of the OAuth flow.",
"session_id": "abc123…"
}Returns 202 Accepted on success. Rate-limit and retention live in the platform's ingestion layer — no client-side tuning required.
Privacy
No IPs, no cookies, no localStorage. The widget reads a per-tab sessionStorage id that the analytics beacon also uses, so one session's view + feedback tie together on the dashboard without tracking anyone across sessions.