Skip to content

feat: feedback pages with signed links, status changes, share link after sending - #37

Merged
StanBarrows merged 6 commits into
mainfrom
feat/feedback-signed-link
Oct 22, 2026
Merged

StanBarrows merged 6 commits into
mainfrom
feat/feedback-signed-link

Conversation

@StanBarrows

Copy link
Copy Markdown
Contributor

What

  • feedback:link {id} creates a signed, expiring link to an HTML page with all form details (sender, page, browser, system, viewport, console/network log, custom data) and the screenshot (inline, full size, download). Team links have Mark as completed / Reopen buttons; --by is written to the activity log, --read-only omits the buttons, --expires (default 7 days, max 30).
  • Share link after sending: the API returns a read-only signed url (FEEDBACK_SHARE_LINK_MINUTES, 0 = off). The widget shows it on the thank you screen with a copy button and does not auto-close while it is shown. after_send gets url.
  • Close button (✕) in marking mode: top right, bottom right on phones; same as Esc.
  • Docs: features, recipes (environments, intranet, acceptance testing, SaaS, own button), feedback:list --project, multiple origins/IPs, feedback pages and notifications, API responses, config.
  • Also contains docs: fix broken Tests badge in README #33, docs: document multiple origins per project #34 and fix(widget): Alpine/Vue attributes blank the screenshot #35 (merged into this branch to avoid README conflicts).

Security

The API stays closed to browsers: only validly signed links pass BlockBrowserNavigation; invalid, tampered or expired links get the usual empty 403. manage and by are part of the signature, so a sender link can't be turned into a team link. Pages are noindex, no-store, no-referrer, strict CSP with a style nonce, no JavaScript, only http(s) page URLs become links, everything from the browser is escaped. Links can't be revoked individually (rotate APP_KEY to revoke all).

Tests

  • Pest: 322 passed (new FeedbackLinkTest: command, page, escaping, screenshot inline/download, tampering, expiry, status changes + activity log, read-only, sender link, config). Larastan clean, Pint clean, type coverage 100 %.
  • Widget: Vitest 151 passed; Playwright 147 passed (Chromium, WebKit, mobile Chrome/Safari) incl. copy button, unsafe link, close button desktop/mobile.
  • Full stack (e2e:full): widget → share link → page → download → complete/reopen → tampered link 403. Chromium + WebKit green (20/20 repeated runs; one earlier WebKit failure I could not reproduce).
  • Firefox could not launch in my local sandbox; CI covers it.

🤖 Generated with Claude Code

Sebastian BURGIN-FIX (ext) and others added 6 commits October 22, 2026 16:42
…nd share link

- feedback:link creates a signed, expiring link to an HTML page with all form
  details, console/network log and the screenshot (inline + download). Team
  links can complete and reopen (--by is logged), --read-only omits that.
- The store response returns a read-only share link (FEEDBACK_SHARE_LINK_MINUTES,
  0 = off); the widget shows it on the thank you screen with a copy button.
- Annotation mode gets a close button (top right, bottom right on mobile).
- Only validly signed links pass BlockBrowserNavigation; invalid or expired
  links get the usual empty 403.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in/docs/multiple-origins' and 'origin/fix/capture-invalid-attributes' into feat/feedback-signed-link
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Firefox lays out the clone slightly differently, so a fixed point missed
the block. A blank capture has no blue pixels at all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n empty 403

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@StanBarrows
StanBarrows merged commit 7cdcae7 into main Oct 22, 2026
12 checks passed
@StanBarrows
StanBarrows deleted the feat/feedback-signed-link branch October 22, 2026 15:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant