Repository navigation
feat(feedback): in-app bug reports and feature requests for the testing phase - #568
Conversation
The shared contract for in-app feedback (bugs private to reporter and triagers, feature requests on a shared board), plus what the browser collects for a report: page, browser, window, theme, language and the last ten client errors, a viewport screenshot via modern-screenshot (it keeps each pane's scroll position, which html-to-image does not), the typed API client, the Feedback tab's paths and 'Copy as GitHub issue' markdown that leaves out who reported it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One dialog for every signed-in page (employer pages and the workspace picker), shown only when the instance names a triager. A bug needs one line; a feature request a title, with matching requests on the board offered to vote for instead. Screenshots: capture the page, paste or attach, then box or black out parts before sending. What goes with the report is listed in the dialog and technical details can be switched off. Ways in: a floating Feedback button (hideable per person), the account menu, Report a bug / Request a feature in Cmd+K and the right-click menu, Mod+Alt+B, the error screen, a failed source's card and the contact page. English and Simplified Chinese. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Studio tab with its screens across the top: what I reported and the team's replies, the shared board sorted by votes, and for the instance's operators every report with status, severity, reply and Copy as GitHub issue. Link-only (no picker tile), since whether an instance takes reports is the operator's setting. Replies and status changes reach the reporter in the sidebar bell; the shell dispatches the Report a bug shortcut. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feedback_reports (kind, status, severity, reporter, the reporter's workspace set null on delete, stored context, maintained vote count and last activity), feedback_attachments (re-encoded screenshots kept in the row, like profile photos), feedback_votes (one per person per idea) and feedback_replies. Product migration 20261026001358_feedback, DDL only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Session-only routes for filing (multipart, up to three screenshots re-encoded to WebP without metadata), listing per scope (mine, the ideas board, triage), reading, triaging, replying, voting and serving attachments. Triagers are FEEDBACK_ADMIN_EMAILS; while it is empty the feature is off and filing is refused. Visibility is in the queries (a bug is its reporter's and the triagers'; anything else is a 404) and what each reader sees is in present.ts (no author, context or screenshots on someone else's idea; emails only for triagers). A new report posts one line to FEEDBACK_WEBHOOK_URL (Slack text, Discord content with mentions off) after it is stored, never the body. A triager's reply or status change writes a workspace inbox row for the reporter, and the inbox now keeps feedback rows instead of reading them as chat ids. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FEEDBACK_ADMIN_EMAILS and FEEDBACK_WEBHOOK_URL declared in env.ts, passed through Compose's shared allowlist, and documented in .env.example, the deployment guide and the lean-deploy runbook. The web image now carries GIT_COMMIT_SHA (CI passes github.sha; a local build says "unknown" as /api/health always has), which feedback reports record as appVersion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in the bell - Claim /api/feedback in the service map (instance-wide, unscoped), which the route-coverage test requires. - The shared rate limiter answers in English; the feedback screens now say 'too many' themselves, in the reader's language. - A triager is an operator who is often not in the reporter's workspace, so the bell names them 'The team' rather than 'Someone'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ture-request-ui-be3281 # Conflicts: # apps/web/src/app/employer/documents/_workspace/studioPaneIds.ts # apps/web/src/app/employer/documents/_workspace/types.ts # apps/web/src/i18n/messages/en/errors.json # apps/web/src/i18n/messages/en/workspace.json # apps/web/src/i18n/messages/zh-CN/errors.json # apps/web/src/i18n/messages/zh-CN/workspace.json
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 3edbd88b-b231-46bc-8513-fa27070e0763) |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1dec04e0e2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <DropdownMenuItem | ||
| onSelect={() => router.push(toolTabHref(FEEDBACK_TOOL_ID, "/mine"))} |
There was a problem hiding this comment.
Make report follow-up accessible without an active workspace
For a signed-in tester with no active workspace membership, the launcher allows filing feedback but “My reports” navigates to /employer/documents?feature=feedback, which src/middleware.ts:280–289 redirects back to /workspaces or the pending-approval page. The dialog’s “View report” uses the same workspace-only destination. Consequently, testers reporting joining or onboarding problems cannot read the team's responses or add follow-ups until they obtain an active membership. Provide a feedback destination that remains accessible in these session-only contexts.
Useful? React with 👍 / 👎.
| setOpen(false); | ||
| feedback.open({ | ||
| kind: "bug", | ||
| title: text.subject, |
There was a problem hiding this comment.
Cap prefilled source-failure titles to the feedback limit
When a failed source has a long title, failureCopy.reportText() embeds the entire title in the subject, which is passed directly into the feedback draft. Document titles support 256 characters, whereas createFeedbackSchema rejects feedback titles longer than 140; for example, a 124-character filename produces a 145-character English subject. The input's maxLength does not truncate a programmatically supplied value, and Send remains enabled, so this reporting shortcut produces a rejected request unless the tester manually shortens the prefilled title. Truncate the subject to FEEDBACK_LIMITS.titleMax, retaining the full document name in the details.
Useful? React with 👍 / 👎.
Summary
LaunchStack is still in testing, and testers had no in-app way to report a bug or ask for a feature. The contact page only opened a
mailto:(or linked to GitHub issues), and nothing was stored. This PR adds a feedback system:Mod+Alt+B;FEEDBACK_ADMIN_EMAILS. While that is unset the whole feature stays hidden, so nobody files into a void.FEEDBACK_WEBHOOK_URL(Slack or Discord) posts one line per new report: type, title and a triage link, with no body, context or images.Related
None (new feature for the testing phase).
Checklist
pnpm checkpasses (lint + typecheck):tsc --noEmitexit 0 on the whole web app after merging main; eslint exit 0 on every touched filepnpm --filter @launchstack/web testpasses (see Testing)packages/*orpipelines/change.env.exampleandapps/web/src/env.ts, plusdocs/deployment.md, the Azure runbook anddocker-compose.ymlTesting
vantage-overview-screen.test.tsx› "offers to draft again…", is a timing flake under full-suite load: it passes 3/3 when run alone on this branch and passes onmain, and this PR touches no Vantage code.pnpm --filter @launchstack/store db:check --set=product: ok, 38 migrations.appVersionstamped;Notes for reviewers
modern-screenshot(MIT) instead ofhtml-to-image, because the latter captures scrolled panes from the top. It can't draw iframes or images from other origins that refuse CORS; the dialog then says to paste or attach instead.GIT_COMMIT_SHAis now passed into the web image bydocker.yml, so reports, and/api/health, carry the real commit.FEEDBACK_ADMIN_EMAILS(and optionallyFEEDBACK_WEBHOOK_URL) on the host after deploy.mainin (it conflicted with the new Workspace tab in the Studio registry and i18n). Both sides were kept.🤖 Generated with Claude Code
Note
Medium Risk
New authenticated APIs, Postgres blob storage for screenshots, and privacy-sensitive triage rules; feature is gated by env but touches notifications and broad UI surfaces once enabled.
Overview
Adds an in-app feedback system (bugs + feature ideas) that stays off until
FEEDBACK_ADMIN_EMAILSnames triagers; optionalFEEDBACK_WEBHOOK_URLposts a one-line Slack/Discord alert with no sensitive content.Backend: New Postgres tables and store for reports, votes (ideas only), replies, and WebP attachments (re-encoded, metadata stripped). REST under
/api/feedbackwith multipart create, rate limits, and role-based visibility (bugs private to reporter/triagers; ideas public without author/context/screenshots). Triagers can patch status/severity; reporters get workspace inbox rows on reply/status change (notifications route now keeps feedback entries only for reports they filed).Client:
FeedbackProvider+ reporter dialog (page context, optional technical details, screenshots viamodern-screenshot), and a Feedback Studio tab (My reports / Ideas / Triage). Entry points include launcher, account menu, contact banner, failed-source and error-boundary flows, inbox bell deep links, and afeedback.reportshortcut.Ops: Documents new env vars; Docker CI passes
GIT_COMMIT_SHAinto the web image for/api/healthand stamped reportappVersion.Reviewed by Cursor Bugbot for commit 1dec04e. Bugbot is set up for automated code reviews on this repo. Configure here.